我创建了一个链接列表程序,它与c中的int完美配合。 但是如果将参数更改为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数组
感谢
答案 0 :(得分:1)
问题在于这个分配:
malloc(sizeof(list))
它显示了制作指针的类型别名的问题,因为这里只分配指针的大小而不是整个结构。
答案 1 :(得分:0)
您的分配是错误的,因为您通过typedef
指针使其混乱,不要这样做
n = malloc(sizeof(*n));
不易出错。
检查malloc()
的返回值,不需要演员表,所以
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);
你没有函数原型,所以你的编译器使用隐式函数声明,这很糟糕,因为它会假设所有函数都返回int
,所以你需要在定义之前添加这些函数main()
list createList();
list insert_start(list l1, char val[]);
void showList(list l1);
特别是前两个非常重要,启用编译器警告来防止这种情况。
这是您修改的代码:
#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()
功能。
答案 2 :(得分:0)
typedef struct node *list;
n =(list )malloc(sizeof(list));
list
是指向struct node
的指针,malloc()应该传递有效字节的大小来执行strcpy
,如果你是,则list可以只是8
个字节工作64但机器。将malloc()分配更改为指针指向的大小。