适用于malloc的正确论据

时间:2014-05-20 21:20:50

标签: c

我一直使用malloc函数,例如

int size = 10000;
int *a;
a = malloc(size * sizeof(int));

我最近碰到了一段丢弃sizeof(int)部分的代码,即

int size = 10000;
int *a;
a = malloc(size);

这第二个代码似乎工作正常。

我的问题是,哪种形式是正确的?如果第二种形式是,我是否用第一种形式分配了不必要的空间。

3 个答案:

答案 0 :(得分:6)

malloc的参数是要分配的字节数。如果您需要n类型T元素数组的空间,请致电malloc(n * sizeof(T))malloc不知道类型,它只关心字节。

唯一的例外是,当您为(byte / char)字符串分配空间时,sizeof可以省略,因为在{C中的每个定义sizeof(char) == 1。做类似

int *a = malloc(10000);
a[9000] = 0;

现在似乎可行,但实际上利用了未定义的行为。

答案 1 :(得分:3)

malloc分配给定数量的字节值的内存,适合任何类型。如果要存储N类型的T元素,则需要N * sizeof(T)个字节的对齐存储空间。通常情况下,T * p = malloc(N * sizeof(T))会提供该内容,并允许您将[{1}}中的元素编入[0,N}中的p[i]索引。

答案 2 :(得分:2)

从手册页:

  

malloc()函数分配大小字节并返回指向已分配内存的指针。

第一种形式是正确的。

即使你所针对的机器上的sizeof(int)是一个(在8位微控制器上有时也是如此),你仍然希望你的代码可读。

"第二代码似乎工作得很好"是你很幸运。

您正在使用的malloc版本可能正在返回指向大于您请求的内存区域的指针。无论幕后发生什么,如果你切换到不同的编译器,行为可能会改变,所以你不想依赖它。