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

时间:2013-09-17 15:48:42

标签: 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));
}

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

4 个答案:

答案 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来满足您的动态数组需求......它知道它的大小并且不会忘记取消分配。