2016-04-06 21 views
-1

Ich machte Code von Bob der Erbauer, es ist eine Struktur, jeder Bob der Erbauer hat Namen und zwei weitere Ganzzahlen (ist nicht wirklich wichtig). gibt es drei FunktionenStrukturen mit Zeigern falsch erhalten

  1. die Struktur initialisiert werden (mit „bob“ und 0 und 3)

  2. die zweite Funktion zwei Strukturen erhalten und es braucht ist zwischen diesen Strukturen zu kopieren

  3. die dritte Funktion ist, die Namen (char *) jedes Bobs freizugeben.

Zunächst wird die zweite Funktion (Kopie) ging im Debuggen falsch, weil sie nicht den Namen kopiert haben (Ihre Hilfe brauchen bei der Analyse, warum es passiert ist) und zum anderen der Code abgestürzt in der freien Funktion. Kann mir jemand sagen, wie man Namen (char *) von Strukturen freigibt?

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#define LENGTH_OF_BOB 4 

typedef struct bobTheBuilder 
{ 
    char* name; 
    int fixed; 
    int maxFix; 
}bob; 

//typedef struct bobTHeBuilder bob; 

void deleteBob(bob currBob); 
void initBob(bob *currBob); 
void copyStruct(bob* dst, bob src); 
int main(void) 
{ 
    bob currBob = {0,0,0}; 
    bob secondBob; 
    initBob(&currBob); 
    copyStruct(&secondBob, currBob); 
    deleteBob(currBob); 
    deleteBob(secondBob); 
    system("PAUSE");  
    return 0; 
} 
/* 
*/ 
void initBob(bob *currBob) 
{ 
    char* str = (char*)calloc(LENGTH_OF_BOB, sizeof(char)); 
    char string[] = "bob"; 
    if (str) 
    { 
     strcat(string, "\0"); 
     str = string; 

     currBob->name = str; 
     currBob->fixed = 0; 
     currBob->maxFix = 3; 
    } 
} 
/* 
*/ 
void deleteBob(bob currBob) 
{ 
    free(currBob.name); 
} 
void copyStruct(bob* dest, bob src) 
{ 
    dest->fixed = src.fixed; 
    dest->maxFix = src.maxFix; 
    dest->name = (char*)malloc(sizeof(char) *LENGTH_OF_BOB); 
    strncpy(dest->name, src.name, LENGTH_OF_BOB); 
} 
+0

[Bitte sehen Sie diese Diskussion auf warum nicht zu c ast der Rückgabewert von 'malloc()' und Familie in 'C'.] (http://stackoverflow.com/q/605845/2173917). –

+0

nur wenn du denkst, dass es nicht schlimmer werden kann, dann "strncpy" tritt dich in den Darm –

+0

In der Tat. Google "warum ist strncpy unsicher?". – Lundin

Antwort

3

In initBob Sie haben:

char* str = (char*)calloc(LENGTH_OF_BOB, sizeof(char)); 
char string[] = "bob"; 
str = string; 
currBob->name = str; 

Das currBob->name auf eine lokale automatische Variable Punkt setzt. Nicht zu dem dynamisch zugewiesenen Puffer. Die automatische Variable verlässt den Gültigkeitsbereich, wenn die Funktion beendet wird und daher nicht mehr gültig ist. Und natürlich kann es nicht freigegeben werden, da es nicht dynamisch zugewiesenen Speicher ist.

Ich bin mir nicht wirklich sicher, was Sie dort zu tun versuchen. Neben der falschen Einstellung str, um auf eine lokale Variable zu zeigen, haben Sie auch eine unnötige strcat. Ich schätze, Sie versuchen, den Puffer zu beenden. Dies ist jedoch nicht notwendig, da die Initialisierung eines nicht zugeordneten Char-Arrays mit einem String-Literal bereits eine NUL-Beendigung garantiert.

Mit diesen Fragen im Kopf, sollte die initBob Funktion mehr wie:

void initBob(bob *currBob) 
{ 
    currBob->name = calloc(LENGTH_OF_BOB, sizeof(char)); 
    if (currBob->name) 
    { 
     strcpy(currBob->name, "bob"); 
     currBob->fixed = 0; 
     currBob->maxFix = 3; 
    } 
} 
0

Ich weiß nicht, ob es nur ein einfaches Beispiel zu lernen, wie es zu tun, oder wenn es wirklich Ihr Umfang ist, aber wenn Sie diese Anwendung tun: strdup()

void initBob(bob *currBob) 
{ 
if (currBob->name) 
{ 
    currBob->name=strdup("bob"); 
    currBob->fixed = 0; 
    currBob->maxFix = 3; 
} 
} 

als müssen Sie befreien() es irgendwo, weil malloc() der String ... es ANSI-Standard ist

Verwandte Themen