如何腾出访问语音写作位置

时间:2016-07-05 06:21:10

标签: c++ c visual-studio-2012

我在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
}

它是什么原因?

2 个答案:

答案 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个字节,较小