2012-04-13 3 views
2

ich eine Grundstruktur haben wie dieseSegmentation Fault in strcpy()

typedef struct struck { 
    char* id; 
    char* mat; 
    int value; 
    char* place; 
} *Truck; 

Und eine Funktion wie diese, die eine neue "Instanz" von dieser Struktur erzeugt:

Truck CTruck(char* id, char* mat, int value, char* place) { 
    Truck nT = (Truck) malloc(sizeof (Truck)); 
    nT->value = value; 
    strcpy(nT->id, id); 
    strcpy(nT->mat, mat); 
    strcpy(nT->place, place); 
    return nT; 
} 

Ich erhalte ein Fehler in der ersten strcpy. Es kompiliert ohne Probleme.

Antwort

11

Ihr typedef definiert Truck als struct struck *, d. H. Einen Zeiger. So ist die Größe 4 oder 8 je nach der Architektur und nicht die Größe der Struktur

Verwenden Sie sizeof(*Truck), um die tatsächliche Größe der Struktur zu erhalten.

Sie müssen auch Speicher für die Zeichen reservieren. Der einfachste Weg wäre die Verwendung von strdup().

Truck CTruck(const char* id, const char* mat, int value, const char* place) { 
    Truck nT = malloc(sizeof (*Truck)); 
    nT->value = value; 
    nT->id = strdup(id); 
    nT->mat = strdup(mat); 
    nT->place = strdup(place); 
    return nT; 
} 

Allerdings würde ich Ihre typedef Wechsel vorschlagen, so dass es ein Alias ​​für die Struktur ist, nicht für einen Zeiger auf sie:

typedef struct { 
    char* id; 
    char* mat; 
    int value; 
    char* place; 
} Truck; 

In Ihrer Funktion Sie diese dann verwenden:

Truck *nT = malloc(sizeof(Truck)); 
+1

+1: Dies ist eines der Probleme. – ArjunShankar

+1

+1 Und auch Malloc etwas Platz für ID, Matte und Platz, so dass die Strcpys keine zufällige Erinnerung auslöschen. – JeremyP

+2

'strdup' ftw; keine Notwendigkeit, malloc und das böse 'strcpy' zu verwenden – ThiefMaster

7

nT->id ist nur ein Zeiger. Need to malloc Speicher zum Kopieren der Zeichenfolge in. Dito für die anderen.

+0

+1: Dies ist eines der Probleme. – ArjunShankar

4

Ihre Verwendung von sizeof ist falsch. Im Allgemeinen muss das Argument malloc() "die Größe dessen sein, auf das der zurückgegebene Zeiger zeigt". Mit anderen Worten, Sie benötigen sizeof *nT. Sehen Sie, wie dies auch die Wiederholung des Typennamens beseitigt (Truck)?

Auch in C Sie don't need to cast the return value of malloc(); es dient keinem Zweck, kann einen tatsächlichen Fehler verbergen und macht den Code schwerer lesbar.

Wie andere darauf hingewiesen haben, weisen Sie auch keinen Platz für String-Daten zu, Sie haben nur die Zeiger in Ihrer Struktur.

+0

+1 für das Erwähnen des Castings von malloc Rückgabewert. – ArjunShankar