为什么在 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
我猜因为 pa
是 struct 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))但您仍然尝试使用该对象,您将遇到未定义的行为 - 您的程序不是定义不再明确,任何事情都可能发生(什么都没有,崩溃,内存损坏,黑客拥有您的计算机)。
在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
不是 return 分配的内存块的大小(C 没有获取该信息的标准方法);它 return 是基于操作数类型的操作数的大小。因为你的指针是struct A*
类型,sizeof操作数是struct A
类型,所以sizeof总是returns 8.
因此,即使您为 10000 字节的结构分配 1 个字节,您仍然会看到 sizeof
return 10000。
如果您没有为该对象分配足够的内存(例如,因为 sizeof(int) < sizeof(struct A))但您仍然尝试使用该对象,您将遇到未定义的行为 - 您的程序不是定义不再明确,任何事情都可能发生(什么都没有,崩溃,内存损坏,黑客拥有您的计算机)。