C malloc仅为int*分配了8个字节

Mor*_*lde 4 c malloc

我正在尝试创建一个指向函数中6元素的指针int,以便稍后返回它,所以为了这个目的我正在使用malloc,但它似乎并没有像我预期的那样行事.这是代码:

int j = 0;
for (;j < 5; j++) {
    int * intBig = malloc(j * sizeof(int));
    printf("sizeof intBig - %ld\n", sizeof(intBig));
}
Run Code Online (Sandbox Code Playgroud)

打印与每次迭代时相同的数字8字节sizeof(intBig).而我期待一系列的4, 8, 12, 16.在这个例子中我错过了什么?

Joe*_*oey 10

这是因为你打印的是一个大小int *.这样的指针总是具有相同的大小.sizeof是一个编译器构造.它不能知道仅在运行时发生的事情,例如动态内存分配.它会是什么样的

int intBig[100];
Run Code Online (Sandbox Code Playgroud)

然后你会得到数组的大小(以字节为单位),因为编译器知道它有多大.但是sizeof运算符的结果总是一个编译时常量¹,所以你没有办法产生任何其他东西.

此外,你有一个内存泄漏因为你没有free再次记忆.


¹可变长度数组(VLA)是一个例外,但这里没有使用它们.

  • "sizeof运算符始终是编译时常量"与C标准6.5.3.4 2"不一致..."如果操作数的类型是**可变长度数组类型**,则评估操作数;*否则*,不评估操作数,结果是整数常量." (2认同)

unw*_*ind 5

你不能用来计算sizeof从中返回的内存块的大小 malloc().

除了在C99和以后的可变长度数组,sizeof工作对静态已知尺寸.