为什么在 malloc 中使用 sizeof?

why using sizeof in malloc?

在IDEONE上执行这段代码时:

#include <stdio.h>
#include <stdlib.h>

struct A{
    int x;
    char c;
};

struct B{
    int y;
};

int main(void) {
    // your code goes here
    struct A* pa = malloc(sizeof(struct B));
    printf("%d\n",sizeof(*pa));
    pa = malloc(sizeof(int));
    printf("%d\n",sizeof(*pa));
    pa = malloc(sizeof(char));
    printf("%d\n",sizeof(*pa));
    pa = malloc(0);
    printf("%d\n",sizeof(*pa));
    return 0;
}

我得到了:

8
8
8
8

我猜因为 pastruct A * 类型并且 struct A 是 8 个字节长,所以 malloc 分配了 8 个字节,这是应该的,但如果是这样的话,为什么要使用 sizeof?

sizeof 不是 return 分配的内存块的大小(C 没有获取该信息的标准方法);它 return 是基于操作数类型的操作数的大小。因为你的指针是struct A*类型,sizeof操作数是struct A类型,所以sizeof总是returns 8.

因此,即使您为 10000 字节的结构分配 1 个字节,您仍然会看到 sizeof return 10000。

如果您没有为该对象分配足够的内存(例如,因为 sizeof(int) < sizeof(struct A))但您仍然尝试使用该对象,您将遇到未定义的行为 - 您的程序不是定义不再明确,任何事情都可能发生(什么都没有,崩溃,内存损坏,黑客拥有您的计算机)。