2016-05-23 32 views
-2

我的代码运行良好,并给出正确的结果多达3次迭代。但是,我经过3次迭代得到一个分段错误,当我试图运行下面的代码:尝试使用C中的realloc扩展数组时遇到了分段错误错误

int addNode(double* distNewNode,int placeCount, int* phi,double* lambda) 
{ 
    int i ; 
    int nextPlaceCount = placeCount+1; 
    //int nodeCount = placeCount -1; 

    phi= realloc(phi,nextPlaceCount*sizeof(int)); 
    lambda = realloc(lambda,nextPlaceCount*sizeof(double)); //This line throws the error 

    phi[placeCount] = placeCount; 
    lambda[placeCount] = DBL_MAX; 
    for (i = 0;i < placeCount; i++) 
     if (lambda[i] >= distNewNode[i]) 
    { 
      if (lambda[i] <= distNewNode[phi[i]]) 
       distNewNode[phi[i]] = lambda[i]; 
       lambda[i] = distNewNode[i]; 
       phi[i] = placeCount; 
    } 
     else if (distNewNode[i] < distNewNode[phi[i]]) 
      distNewNode[phi[i]] = distNewNode[i]; 

    for (i = 0;i < placeCount;i++) 
     if(lambda[i] >= lambda[phi[i]]) 
      phi[i] = placeCount; 

    return 1; 
} 

这里是我叫ADDNODE()函数:

int main() 
{ 
    //Create distMat here 
    int* phi; 
    phi = (int*)malloc(1); 
    phi[0] = 1; 
    //phi[1] = 1; 

    double* lambda; 
    lambda = (double*)malloc(1); 
    //lambda[0] = 1.2; 
    lambda[0] = DBL_MAX; 

    int isNodeAdded; 

     for (int placeCount=0; placeCount < 10;placeCount++) 
    { 
     double* temp =(double*) malloc(placeCount); 
     for (int j= 0;j < placeCount ;j++) 
     { 
      temp[j] = distMat[placeCount][j]; 

     } 
     isNodeAdded = addNode(temp,placeCount,phi,lambda); 
     cout << "isNodeAdded: "<<isNodeAdded << endl; 
     free(temp); 

     for (int i=0;i < placeCount ;i++) 
     { 
      printf("Node= %d Pi = %d Lambda = %f \n",i,phi[i],lambda[i]); 
     } 
    } 
} 

我的输出是:

isNodeAdded: 1 
isNodeAdded: 1 
Node= 0 Pi = 1 Lambda = 1.200000 
isNodeAdded: 1 
Node= 0 Pi = 1 Lambda = 1.200000 
Node= 1 Pi = 2 Lambda = 3.400000 
isNodeAdded: 1 
The program has unexpectedly finished. 
+2

这不是C!并且请参阅[问] – Olaf

+0

主要功能是C++,但addNode()函数是C. – Bhoke

+0

除非你用C编译器编译它,它不是!阅读我提供的链接!并检查关键功能的结果! – Olaf

回答

2

问题是您通过参数phi的值,这意味着它的值被复制到函数局部变量phi,并且与函数返回时所有局部变量phi超出范围一样,并且函数内的所有更改都将丢失。

如果函数addNode是C源文件,那么你可以不通过参考传递因为它不是用C的支持,所以你必须通过传递指针的指针变量,即在效仿main函数,您需要通过&phi,并修改该函数以取代int **phi,并根据需要正确取消引用该变量。

如果,在另一方面,addNode是在C++源文件,那么可以只改变参数int *&phi,你将有一个参考变量,这将参考作为参数传递的原始变量从main功能。

你也有另外一个问题,这将给你在main功能未定义行为:

phi = (int*)malloc(1); 
phi[0] = 1; 

在这里你分配一个字节,并把它作为一个int它通常四个字节。


在一个不相关的音符,你不应该重新分配的realloc的结果返回给你传递的参数变量。想想如果realloc返回NULL会发生什么。原始指针仍然有效,但是如果您重新分配它,则会丢失指针,从而导致内存泄漏。

+1

我编辑过这样的部分: 'int * phi; phi =(int *)malloc(1 * sizeof(int)); phi [0] = 1; ' – Bhoke

+0

如果我将它定义为'int ** phi',那么phi [0]是什么?因为我不能再指定整数 – Bhoke

+1

@Boke你有一个指向原始变量的指针,要访问它,你需要*提领*指针,就像'(* phi)[0]'中一样。请注意,这只能在'addNode'函数**中完成**。在'main'函数中,你仍然应该有一个一级指针,即'int * phi'。 –

相关问题