【发布时间】:2015-12-14 23:11:11
【问题描述】:
在 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 而不是什么?
-
如果你不使用
sizeof,你怎么知道你需要为每个结构分配多少内存? -
请注意,您的第一次分配可能会分配 4 个您可以使用的数据字节,但要将该空间用作
struct A,您需要 8 个字节。像Valgrind 这样的工具会抱怨访问越界内存。如果分配的内存不足,一切都会崩溃——它通常会导致缓冲区溢出。幸运的是,您在滥用它之前丢弃了分配不足的内存块(但valgrind会抱怨泄漏)。与其他分配类似。 -
sizeof是一个 compile-time 运算符。它不知道程序运行时指针实际上可能指向什么。它只知道您将pa声明为指向struct A的指针,因此它会为您提供struct A句点的大小。如果你强迫它指向别的东西,那是你的问题。