Ich bekomme einen Segmentierungsfehler, wenn ich frei() in der Löschfunktion der folgenden verketteten Liste Implementierung. Bitte sieh es dir an und sag mir, wo ich falsch liege. Wenn ich dieses Programm mit valgrind ausführe, gibt es kein seg. Fehler, es läuft gut. Also kann ich das Problem nicht lösen.Segmentierungsfehler bei free()
typedef struct node {
char name[100];
int id;
struct node* next;
} Node;
void insert(Node** p, char* _name, int _id)
{
Node *temp, *prev;
temp = malloc(sizeof(struct node));
temp->next = NULL;
strcpy(temp->name,_name);
temp->id = _id;
if(*p == NULL) {
*p = temp;
}
else {
for(prev = *p; prev->next!=NULL; prev=prev->next);
prev->next=temp;
}
}
/* Delete entry
@params p first element
_id ID to delete
*/
void delete_by_id(Node** p, int _id) {
Node *temp, *prev;
prev = NULL;
for(temp = *p; temp!= NULL; prev = temp, temp=temp->next) {
if(temp->id == _id) {
printf("Deleting entry with id: %d\n", temp->id);
if(prev == NULL)
*p = temp->next;
else
prev->next= temp->next;
free(temp);
return;
}
}
}
Hier ist ein Teil des Codes aus dem Hauptprogramm:
Node* p;
int main() {
...
...
buf[rval]=0;
char* tokens = strtok(buf, "+");
char* strArray[5]; /* up-to 5 words can be stored */
int n = 0;
while (tokens)
{
strArray[n] = malloc(strlen(tokens) + 1);
strcpy(strArray[n++], tokens);
tokens = strtok(NULL, "+");
}
int type = 0;
if(strcmp(strArray[0], "1") == 0)
type = 1;
else
type = 2;
char* name = "";
if(type == 1) {
name = strArray[1];
insert(&p, name, clients[i]);
display(&p);
} else {
name = strArray[1];
rval = search(&p, name);
if(rval) {
delete_by_id(&p, rval);
display(&p);
}
}
for (i = 0; i < 5; i++)
{
if (strArray[i]) // check for null data
free(strArray[i]);
}
...
...
}
int search(Node** p, char* _name) {
Node *temp;
for (temp = *p; temp!= NULL; temp = temp->next) {
if (strcmp((char *)temp->name, _name)==0) {
printf("Name matched: %s\n", temp->name);
return temp->id;
}
}
return 0;
}
Valgrind beschwert sich über die malloc und kostenlos für strArray verwendet, aber nicht für die verknüpfte Liste.
Es lohnt sich, ein kurzes (10-20 Zeilen) 'main()' Programm zu zeigen, das zeigt, wie Sie die Liste unter Verwendung der gezeigten Funktionen zuweisen und freigeben. –
Sie sollten strncpy verwenden, um einen Überlauf von node.name zu vermeiden. – ergosys
@ Jonathan Leffler Ich habe den main() Code hinzugefügt, bitte schauen Sie. – ddd