在 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
我猜测,由于 pa
的类型为 struct A *
并且 struct A
的长度为 8 个字节,因此 malloc 分配的是 8 个字节字节,应该如此,但如果是这样,为什么要使用 sizeof?
最佳答案
sizeof
不返回已分配的内存块的大小(C 没有获取该信息的标准方法);它根据操作数的类型返回操作数的大小。由于您的指针类型为 struct A*
,操作数的大小为 struct A
类型,因此 sizeof 始终返回 8。
所以,即使你为 10000 字节的结构分配 1 个字节,你仍然会看到 sizeof
返回 10000。
如果您没有为该对象分配足够的内存(例如,因为 sizeof(int) < sizeof(struct A)),但您无论如何都尝试使用该对象,您将遇到未定义的行为 - 您的程序不再正常已定义,任何事情都可能发生(什么都没有、崩溃、内存损坏、黑客拥有您的计算机)。
关于c - 为什么在malloc中使用sizeof?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641228/