链表中的char数组导致core dump
Char array in linked list causes core dump
我创建了一个链表程序,它与 c 中的整数完美配合。
但如果将参数更改为 char 数组,并尝试执行 strcpy,则会导致核心转储。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char mac[25];
struct node * next;
};
typedef struct node *list;
int main(void) {
lista c;
c = creoLista();
c = insert_start(c, "aa:bb:cc:dd:e1");
c = insert_start(c, "aa:bb:cc:dd:e2");
c = insert_start(c, "aa:bb:cc:dd:e3");
showList(c);
return 0;
}
list createList() {
return NULL;
}
list insert_start(list l1, char val[]) {
list n;
n =(list )malloc(sizeof(list));
strcpy(n->mac,val);
printf("ADDED: %s en ADDRESS:%p NEXT ADDRESS: %p\n", n->mac,(void *)(&n), (void *) (&n->next));
n -> next = l1;
return n;
}
void showList(list l1) {
while (l1 != NULL){
printf("Value: %s Address: %p\n",l1 -> mac,(void *) (&l1 -> next) );
l1 = l1 -> next;
}
}
关于我做错了什么以及为什么它适用于 int 而不是 char 数组的任何提示
谢谢
你的分配是错误的,因为你通过 typedef
ing 一个指针让它变得混乱,不要那样做
n = malloc(sizeof(*n));
不容易出错。
查看malloc()
的return值,不需要强制转换,所以
n = malloc(sizeof(*n));
if (n == NULL)
return NULL;
您正在打印 n->next
指针的地址,然后再对其进行初始化,更改此
printf("ADDED: %s en ADDRESS:%p NEXT ADDRESS: %p\n", n->mac,(void *) (&n), (void *) (&n->next));
n->next = l1;
至
n->next = l1;
printf("ADDED: %s en ADDRESS:%p NEXT ADDRESS: %p\n", n->mac, (void *)n, (void *)n->next);
你没有函数原型,所以你的编译器使用隐式函数声明,这是不好的,因为它会假定所有函数 return int
,所以你需要在 main()
的定义之前添加这些
list createList();
list insert_start(list l1, char val[]);
void showList(list l1);
特别是前 2 个非常重要,启用编译器警告以防止出现这种情况。
这是您修复的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char mac[25];
struct node * next;
};
typedef struct node *list;
list insert_start(list l1, char val[]);
void showList(list l1);
int main(void) {
lista c;
c = insert_start(NULL, "aa:bb:cc:dd:e1");
c = insert_start(c, "aa:bb:cc:dd:e2");
c = insert_start(c, "aa:bb:cc:dd:e3");
showList(c);
return 0;
}
list insert_start(list l1, char val[]) {
list n;
n = malloc(sizeof(*n));
if (n == NULL)
return NULL;
strcpy(n->mac, val);
n->next = l1;
printf("ADDED: %s en ADDRESS:%p NEXT ADDRESS: %p\n", n->mac, (void *)n, (void *)n->next);
return n;
}
void showList(list l1) {
while (l1 != NULL) {
printf("Value: %s Address: %p\n", l1->mac, (void *)l1->next);
l1 = l1->next;
}
}
你还需要一个 freeList()
函数。
问题是这个分配:
malloc(sizeof(list))
它显示了为指针创建类型别名的问题,因为您在这里只分配了指针的大小而不是整个结构。
typedef struct node *list;
n =(list )malloc(sizeof(list));
list
是指向结构 node
的指针,malloc() 应该传递有效字节的大小以执行 strcpy
并且列表可以只是 8
字节,如果你在 64 位机器上工作。将 malloc() 分配更改为指针指向的大小。
我创建了一个链表程序,它与 c 中的整数完美配合。 但如果将参数更改为 char 数组,并尝试执行 strcpy,则会导致核心转储。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char mac[25];
struct node * next;
};
typedef struct node *list;
int main(void) {
lista c;
c = creoLista();
c = insert_start(c, "aa:bb:cc:dd:e1");
c = insert_start(c, "aa:bb:cc:dd:e2");
c = insert_start(c, "aa:bb:cc:dd:e3");
showList(c);
return 0;
}
list createList() {
return NULL;
}
list insert_start(list l1, char val[]) {
list n;
n =(list )malloc(sizeof(list));
strcpy(n->mac,val);
printf("ADDED: %s en ADDRESS:%p NEXT ADDRESS: %p\n", n->mac,(void *)(&n), (void *) (&n->next));
n -> next = l1;
return n;
}
void showList(list l1) {
while (l1 != NULL){
printf("Value: %s Address: %p\n",l1 -> mac,(void *) (&l1 -> next) );
l1 = l1 -> next;
}
}
关于我做错了什么以及为什么它适用于 int 而不是 char 数组的任何提示
谢谢
你的分配是错误的,因为你通过
typedef
ing 一个指针让它变得混乱,不要那样做n = malloc(sizeof(*n));
不容易出错。
查看
malloc()
的return值,不需要强制转换,所以n = malloc(sizeof(*n)); if (n == NULL) return NULL;
您正在打印
n->next
指针的地址,然后再对其进行初始化,更改此printf("ADDED: %s en ADDRESS:%p NEXT ADDRESS: %p\n", n->mac,(void *) (&n), (void *) (&n->next)); n->next = l1;
至
n->next = l1; printf("ADDED: %s en ADDRESS:%p NEXT ADDRESS: %p\n", n->mac, (void *)n, (void *)n->next);
你没有函数原型,所以你的编译器使用隐式函数声明,这是不好的,因为它会假定所有函数 return
的定义之前添加这些int
,所以你需要在main()
list createList(); list insert_start(list l1, char val[]); void showList(list l1);
特别是前 2 个非常重要,启用编译器警告以防止出现这种情况。
这是您修复的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char mac[25];
struct node * next;
};
typedef struct node *list;
list insert_start(list l1, char val[]);
void showList(list l1);
int main(void) {
lista c;
c = insert_start(NULL, "aa:bb:cc:dd:e1");
c = insert_start(c, "aa:bb:cc:dd:e2");
c = insert_start(c, "aa:bb:cc:dd:e3");
showList(c);
return 0;
}
list insert_start(list l1, char val[]) {
list n;
n = malloc(sizeof(*n));
if (n == NULL)
return NULL;
strcpy(n->mac, val);
n->next = l1;
printf("ADDED: %s en ADDRESS:%p NEXT ADDRESS: %p\n", n->mac, (void *)n, (void *)n->next);
return n;
}
void showList(list l1) {
while (l1 != NULL) {
printf("Value: %s Address: %p\n", l1->mac, (void *)l1->next);
l1 = l1->next;
}
}
你还需要一个 freeList()
函数。
问题是这个分配:
malloc(sizeof(list))
它显示了为指针创建类型别名的问题,因为您在这里只分配了指针的大小而不是整个结构。
typedef struct node *list;
n =(list )malloc(sizeof(list));
list
是指向结构 node
的指针,malloc() 应该传递有效字节的大小以执行 strcpy
并且列表可以只是 8
字节,如果你在 64 位机器上工作。将 malloc() 分配更改为指针指向的大小。