1

我的代码有问题,希望您能提供帮助。当我输入一个奇数时,会出现分段错误,如果是偶数,则会出现总线错误。我正在尝试将 00 添加到数据数组中,以将其从长度 Nprime 变为我输入的新的、更大长度的 Ndprime。我在函数 *fpad 中执行此操作,其中我的 paddata 数组包含 Nprime 复数(即 2*Nprime 分量),并且需要达到 2*Ndprime 的大小。

double *fpad(double *paddata, unsigned int Nprime, unsigned int Ndprime)
{   
   if (Nprime!=Ndprime)
   {
       paddata=(double*)realloc(paddata,(sizeof(double)*((2*Ndprime)-1)));

       for(i>=((2*Nprime));i<(2*Ndprime);i++) paddata[i]=0;  

       if(paddata==NULL)              /* Checks memory is reallocated */
       {
           printf("\nError reallocating memory.\n");
           free(paddata);
           exit(EXIT_FAILURE);
       } 
    }
  return(paddata);  
}

任何帮助将不胜感激,我看不出我做错了什么。

4

2 回答 2

1

您正在使用未声明的变量i(或者它可能是全局变量)。

for(i>=((2*Nprime));i<(2*Ndprime);i++) paddata[i]=0;

您的第一个条件检查是否i小于或大于2*Nprime(但不设置i)。然后它使用这个未正确初始化的值来访问数组,i这可能是负数,这会导致问题。

您仅在上述被诊断为有问题的循环之后检查内存重新分配是否成功。如果内存分配失败,您已经在此函数中小心地删除了指针的原始副本。释放空指针没有意义——但由于分配失败时退出,所以问题不大。

将初始化循环放在内存检查之后,括号的数量稍微少一些:

for (int i = 2*Nprime; i < 2*Ndprime; i++)  // C99 (and C++)
    paddata[i] = 0.0;

如果不能使用 C99 表示法,int i;请在函数中声明。

永远不要创建名为 的全局变量i

请注意编译器的警告。如果它没有警告您“无效声明”,则说明您没有打开足够的警告。

于 2012-11-09T00:22:57.427 回答
0

我推荐函数memset函数来初始化你的动态数组。我认为'for'语句中的索引'i'应该在 0 到 2*Ndprime-2 之间。

于 2012-11-09T00:38:10.893 回答