我正在尝试在函数中创建一个指向6
元素int
的指针,以便稍后返回它,所以为此目的我正在使用malloc
,但它似乎表现得不像我预期的那样。这是代码:
int j = 0;
for (;j < 5; j++) {
int * intBig = malloc(j * sizeof(int));
printf("sizeof intBig - %ld\n", sizeof(intBig));
}
在每次迭代时打印与8
相同的sizeof(intBig)
个字节。虽然我期待一系列4, 8, 12, 16
。在这个例子中我错过了什么?
答案 0 :(得分:10)
这是因为您打印的是int *
的大小。这样的指针总是具有相同的大小。 sizeof
是一个编译器构造。它不能知道仅在运行时发生的事情,例如动态内存分配。会不会像
int intBig[100];
然后你会得到数组的大小(以字节为单位),因为编译器知道它有多大。但是sizeof
运算符的结果总是一个编译时常量¹,所以你没有办法产生任何其他东西。
此外,你有一个内存泄漏,因为你不再free
你的记忆。
¹可变长度数组(VLA)是个例外,但这里没有使用它们。
答案 1 :(得分:5)
您不能使用sizeof
来确定从malloc()
返回的内存块的大小。
除了C99及更高版本中的可变长度数组外,sizeof
仅在静态已知大小上 。
答案 2 :(得分:2)
因为每次打印的指针大小都是8字节的地址大小。
答案 3 :(得分:2)
sizeof
告诉您指针intBig
的大小,而不是它指向的大小。
没有标准的方法来发现它指向的内存块的大小,所以你必须单独记住它。
如果您有权访问C ++,只需使用std::vector
来满足您的动态数组需求......它知道它的大小并且不会忘记取消分配。