【问题标题】:Bus error and Segmentation fault depending on value inputted总线错误和分段错误取决于输入的值
【发布时间】:2012-11-09 00:16:50
【问题描述】:

我的代码有问题,希望您能提供帮助。当我输入一个奇数时,会出现分段错误,如果是偶数,则会出现总线错误。我正在尝试将 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);  
}

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

【问题讨论】:

  • 当你知道free(paddata)NULL 时,它毫无意义。

标签: c memory-management segmentation-fault bus


【解决方案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 的全局变量。

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

【讨论】:

  • 我已经让它工作了,令人尴尬的是我在之前的函数中将我的 paddata 数组分配得太小了。但是,谢谢,我现在已经定义了我的 i,但是需要这条线吗?我认为重新分配的数组有未初始化的元素,它们是否已经用 0 填充?
  • 这些事情发生了。请注意i。这个问题可能会被关闭“过于本地化”;无意冒犯,但这个问题将来不会轻易帮助其他人。
  • 数组中多余的数据未初始化;你想初始化它是正确的。但是,您应该只在您知道有数据要初始化时才进行初始化——在您检查了分配之后。当然,您需要确保使用的循环变量本身已正确初始化。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-10-24
    • 2011-10-02
    • 2011-07-24
    • 1970-01-01
    • 2012-12-14
    • 2017-10-24
    • 1970-01-01
    • 2014-06-10
    • 2018-04-10
    相关资源
    最近更新 更多