2012-11-09 38 views
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); 
} 

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

+0

当你知道它是'NULL'时,'free(paddata)'没有意义。 – Jens

回答

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的全局变量。

请注意编译器的警告。如果它没有警告你'没有效果的陈述',那么你没有发出足够的警告。

+0

我已经得到它的工作,embarrissingly我会在以前的函数mableced我的paddata数组太小。但是,谢谢你,我已经定义了我的i,但是是需要的行吗?我认为realloced数组有未初始化的元素,它们是否已经填满0? –

+0

发生这些事情。请注意'我'。这个问题可能会被封闭,“太局部”。没有打算犯罪,但这个问题在未来不会帮助其他人。 –

+0

阵列中的额外数据未初始化;你想要初始化它是正确的。但是,只有当您知道有数据要初始化时,才应该初始化 - 在检查分配之后。当然,你需要确保你正在使用一个正确初始化的循环变量。 –

0

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