我一直使用malloc
函数,例如
int size = 10000;
int *a;
a = malloc(size * sizeof(int));
我最近碰到了一段丢弃sizeof(int)
部分的代码,即
int size = 10000;
int *a;
a = malloc(size);
这第二个代码似乎工作正常。
我的问题是,哪种形式是正确的?如果第二种形式是,我是否用第一种形式分配了不必要的空间。
答案 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版本可能正在返回指向大于您请求的内存区域的指针。无论幕后发生什么,如果你切换到不同的编译器,行为可能会改变,所以你不想依赖它。