我在C中处理大小((128 * 75)*(128 * 75))的数组。每当我将数组声明为全局时,就没有像
这样的问题#include<stdio.h>
float buf[(128*75)*(128*75)]
int main()
{
//using buf in different functions works fine
}
但每当我使用malloc声明并使用main()获取访问冲突写入位置错误时,
#include<stdio.h>
int main()
{
float * buf;
buf = malloc((128*75)*(128*75));
//using buf in different functions gives error
}
它是什么原因?
答案 0 :(得分:5)
malloc(x)
仅保留x
字节,而不是x
浮动。
全局数组的大小确实是128 * 75 * 128 * 75浮点数。 malloc-ed缓冲区的大小只有128 * 75 * 128 * 75 字节,即只能包含所需浮点数的四分之一(假设浮点数是平台上的4个字节)。
这就是为什么您可能访问超出malloc-ed缓冲区的限制并获得段错误/访问冲突或在您的平台上调用的任何内容。
您可以使用calloc()
,也可以使用128*75*128*75*sizeof(float)
的大小作为malloc()
的参数。
答案 1 :(得分:1)
首先,为什么不这样做:
int size = 128*75*128*75;
float buf[size];
第二,在使用它之前检查buf != NULL
,因为malloc可能失败了(如果malloc失败,你将获得NULL作为返回值 - 所以你可能会错过,如果你试图使用的数组太大 - 您将收到编译错误 - 不能错过)
第三,在malloc:sizeof
中使用buf = malloc(sizeof(float)*size);
(正如其他人所说的那样,malloc分配字节,当声明数组时 - 编译器知道你想要的元素类型,所以它为你提供了数组大小 - 意味着int a[2]
大小为2*sizeof(int)
,但malloc(2)
大小为2个字节,较小