4

我正在尝试在函数中创建一个指向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

4 回答 4

10

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

int intBig[100];

然后你会得到数组的大小(以字节为单位),因为编译器知道它有多大。但是sizeof运算符的结果始终是编译时常量¹,因此您所拥有的东西不可能产生其他任何东西。

此外,您那里有内存泄漏,因为您没有free再次使用您的内存。


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

于 2013-09-17T15:50:01.173 回答
5

你不能用sizeof它来计算从 malloc().

除了 C99 及更高版本中的可变长度数组外,仅适用sizeof于静态已知大小。

于 2013-09-17T15:50:10.967 回答
2

因为每次打印指针的大小时,指针的大小都是 8 个字节的地址大小。

于 2013-09-17T15:50:08.407 回答
2

sizeof告诉你指针的大小intBig,而不是它指向的内容。

没有标准的方法来发现它指向的内存块的大小,所以你必须单独记住。

如果您可以访问 C++,只需std::vector用于您的动态数组需求......它知道它的大小并且不会忘记释放。

于 2013-09-17T15:50:11.587 回答