2016-05-23 3 views
-2

Mein Code funktioniert gut und liefert bis zu 3 Iterationen richtige Ergebnisse. Allerdings habe ich einen Segmentation Fault Fehler nach 3 Iterationen, wenn ich laufen Code unten versuchen:Segmentierungsfehler beim Versuch, das Array mit Realloc zu erweitern. C

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; 
} 

Hier ist, wie ich die addNode() Funktion aufgerufen:

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]); 
     } 
    } 
} 

Meine Ausgabe ist:

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

Dies ist nicht C! Und siehe [ask] – Olaf

+0

Hauptfunktion ist C++, aber addNode() -Funktion ist C. – Bhoke

+0

Wenn Sie es nicht mit C-Compiler kompilieren, ist es nicht! Lies den Link, den ich zur Verfügung gestellt habe! Und überprüfen Sie die Ergebnisse kritischer Funktionen! – Olaf

Antwort

2

Das Problem ist, dass Sie das Argument phi passieren von Wert, die ihren Wert bedeutet, wird in die Funktion lokal kopiert Variable phi und geht wie bei allen lokalen Variablen phi nicht in den Gültigkeitsbereich, wenn die Funktion zurückkehrt und alle Änderungen innerhalb der Funktion verloren gehen.

Wenn die Funktion addNode in einer Datei C-Quelle ist, dann kann man nicht durch Verweis passieren, da es nicht von C unterstützt wird, so haben Sie es zu emulieren, indem einen Zeiger auf die Zeigervariable vorbei, das heißt in der main Funktion müssen Sie übergeben &phi, und haben Sie die Funktion geändert, um statt int **phi statt, mit der richtigen Dereferenzierung der Variablen nach Bedarf.

Wenn auf der anderen Seite die addNode in einer C++ Quelldatei ist, dann können Sie nur das Argument int *&phi ändern und Sie werden eine Referenzgröße haben, die die ursprüngliche Variable als Argument aus den main geben verweisen, Funktion.

Sie haben auch ein anderes Problem, das Sie nicht definiertes Verhalten in der main Funktion geben:

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

Hier können Sie zuteilen ein Byte, und verwenden Sie es als int, welche es in der Regel vier Bytes.


auf einem nicht verwandten Notiz Sie sollten das Ergebnis von realloc zurück in die Variable nicht neu zuordnen Sie als Argument übergeben. Denken Sie darüber nach, was passiert, wenn reallocNULL zurückgibt. Der ursprüngliche Zeiger ist immer noch gültig, aber wenn Sie ihn neu zuweisen, verlieren Sie den Zeiger und haben dadurch einen Speicherverlust.

+1

Ich habe diesen Teil folgendermaßen bearbeitet: 'int * phi; Phi = (Int *) malloc (1 * Größe von (int)); phi [0] = 1; ' – Bhoke

+0

Wenn ich es als' int ** phi 'definiere, was wird' phi [0] 'sein? weil ich keine ganze Zahl mehr zuweisen kann – Bhoke

+1

@Bhoke Sie haben einen Zeiger auf die ursprüngliche Variable, um darauf zuzugreifen, müssen Sie * Ihren Zeiger * dereferenzieren, wie in '(* phi) [0]'. Beachten Sie, dies sollte nur ** in der Funktion "addNode" ** erfolgen.In der 'main'-Funktion sollten Sie immer noch einen einstufigen Zeiger haben, d. H.' Int * phi'. –