2017-06-08 4 views
0

Hier wird die verknüpfte Liste und die Struktur:Arbeiten mit verknüpften Liste + struct C

#define MAX_PATH_SIZE (256) 
#define MAX_NAME_SIZE (50) 
struct Frame 
{ 
    char *name; 
    unsigned int duration; 
    char *path; // may change to FILE* 
}; 

typedef struct Frame frame_t; 
struct Link 
{ 
    frame_t *frame; 
    struct Link *next; 
}; 

typedef struct Link link_t; 

Und hier ist meine Funktion:

link_t* createFrame(char name[], int duration, char path[]){ 
frame_t * temp = (frame_t*)malloc(sizeof(frame_t)); 
temp->duration = duration; 

strncpy(temp->name, name,MAX_NAME_SIZE); 
strncpy(temp->path, path,MAX_PATH_SIZE); 
link_t* newFrame = (link_t*)malloc(sizeof(link_t)); 

newFrame->frame = temp; 
return newFrame; 
} 

Das Problem ist, dass die Funktion Stopp in der Linie arbeiten " strncpy (temp-> name) .. ", das komische daran ist, dass die temp-> duration funktioniert, aber nicht mit Strings. Fehler: "Nicht behandelte Ausnahme um 0x0F744645 (msvcr120d.dll)"

+2

Mögliche Duplikat (https://stackoverflow.com/questions/5354933/strcpy-with-malloc) – jpw

Antwort

2

Sie haben Speicher für Ihren Name nicht zugewiesen, jetzt zeigen sie auf unbekannten Speicherort und sind undefiniertes Verhalten.

Jetzt ist Speicher für Name und Pfad zugeordnet und Sie können Daten für Name und Pfad kopieren.

Oder, wenn Sie möchten, können Sie Ihre Struktur wie folgt definieren:

struct Frame { 
    char name[MAX_NAME_SIZE + 1]; 
    unsigned int duration; 
    char path[MAX_PATH_SIZE + 1]; 
}; 

Dann brauchen Sie nicht malloc für Namen und Pfad separatelly nennen als Speicher bereits auf den ersten malloc für Struktur zugeordnet werden .

+1

Hinweis Mit 'Strncpy [ 'strcpy' mit 'malloc'?] (temp-> name, name, MAX_NAME_SIZE); ',' temp-> name, name' darf kein _null-Zeichen_ enthalten. – chux

+0

Die Zuweisung ist in Ordnung, aber 'name [MAX_NAME_SIZE];' 'bleibt nicht initialisiert mit' strncpy (temp-> name, name, MAX_NAME_SIZE); '. – chux

+0

Welcher Code setzt 'name [MAX_NAME_SIZE]' '? – chux

0

Sie müssen Speicher zuweisen, um Zeichenfolgen mit strncpy() zu speichern, in Ihrem malloc, das Sie nur genügend reservieren, um sizeof (Struct Frame) Bytes zu speichern.

Sie diese vielleicht von strncpy statt versuchen ...

temp->name = strndup(name, MAX_NAME_SIZE); 
temp->path = strndup(path,MAX_PATH_SIZE); 

... wenn Sie beschränken die maximale Größe von Strings beharren.

+0

Beachten Sie, dass 'strndup()' keine Standard-C-Bibliotheksfunktion ist. Die Implementierungen, die ich das 2. Argument gesehen habe, ist 1 weniger als die maximale _size_. Es ist mehr wie eine maximale Stringlänge. – chux

+0

Was bedeutet "nicht Standard"? Welcher Standard? Dieser - http://man7.org/linux/man-pages/man3/strndup.3p.html? Und dass es Implementierungen gibt, die vom Standard abweichen, ist natürlich. Apropos Standard, "der Mann" scheint Microsoft C zu benutzen. Er könnte gar nicht strength() haben. – Sokre

+0

"Welcher Standard?" -> "Standard-C-Bibliothek" bezieht sich auf die Bibliothek von Funktionen, die in der C11-Spezifikation spezifiziert sind. [ref] (https://stackoverflow.com/q/81656/2410359). Abweichend vom _C_-Standard ist die Implementierung nicht konform. Da 'strndup()' nicht Teil der Standard-C-Bibliotheksfunktion ist, können dessen Signatur und Funktionalität variieren. Die Verwendung von 'strndup()', um die Probleme von OP zu lösen, ist eine gute Idee, aber es fehlt an Portabilität. – chux

0

Versuchen Sie folgendes:

#define MAX_PATH_SIZE (256) 
#define MAX_NAME_SIZE (50) 

struct Frame 
{ 
    char name[MAX_NAME_SIZE]; 
    unsigned int duration; 
    char path[MAX_PATH_SIZE]; // may change to FILE* 
}; 

typedef struct Frame frame_t; 
struct Link 
{ 
    frame_t *frame; 
    struct Link *next; 
}; 

typedef struct Link link_t; 

link_t* createFrame(char name[MAX_NAME_SIZE], int duration, char path[MAX_PATH_SIZE]){ 
    frame_t * temp = (frame_t*)malloc(sizeof(frame_t)); 
    temp->duration = duration; 

    strncpy(temp->name, name, MAX_NAME_SIZE); 
    strncpy(temp->path, path, MAX_PATH_SIZE); 
    link_t* newFrame = (link_t*)malloc(sizeof(link_t)); 

    newFrame->frame = temp; 
    return newFrame; 
} 
+2

Was ist, wenn der String lange 'MAX_NAME_SIZE' Zeichen hat und Sie ihn nach' temp-> name' kopieren? Sie haben ein undefiniertes Verhalten wegen * null * Beendigung. – tilz0R

+0

'strncpy (temp-> name, name, MAX_NAME_SIZE);' nicht sicher _null character_ terminiert 'temp-> name'. Könnte 'temp-> name [MAX_NAME_SIZE - 1] = 0;' anhängen, um eine ordnungsgemäße Beendigung des Strings sicherzustellen. – chux

Verwandte Themen