C中数组的动态内存分配

时间:2013-05-28 23:58:34

标签: c arrays memory dynamic malloc

所以我正在尝试使用malloc在C中创建一个动态数组,但由于某种原因它没有用完。这是我的代码:

    int* test = (int*) malloc(20 * sizeof(int));
    printf("Size: %d\n", sizeof(test));

当我运行此代码时,控制台输出8,尽管理想情况下它应该输出80,我相信,因为int的大小是4,而我正在创建其中的20个。那么为什么这不起作用呢?谢谢你的帮助。 :)

3 个答案:

答案 0 :(得分:8)

sizeof运算符返回int*的大小,它只是一个指针。在C中,当您使用malloc动态分配内存时,对malloc的调用会返回指向新分配的内存块的指针(通常在堆上)。指针本身只是一个内存地址(通常在大多数现代系统中只占用4或8个字节。您需要跟踪自己分配的实际字节数。

C语言只跟踪静态分配的缓冲区(堆栈数组)的缓冲区大小,因为数组的大小在编译时可用。

int test[100];
printf("Sizeof %d\n", sizeof(test))

这将打印一个等于100 * sizeof(int)的值(在大多数现代机器上通常为400)

答案 1 :(得分:3)

此处sizeof运算符为您提供存储int*所需的字节数 即相当于sizeof(int*);
根据编译器的不同,它可能会为您提供48

在C中,程序员可以跟踪动态分配的字节数。

答案 2 :(得分:0)

如果您尝试打印sizeof(& test)的值,您将得到80(20 * 4)。 & test的类型为int(*)[20]。

我希望它能澄清你的怀疑。