链表中的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 数组的任何提示

谢谢

  1. 你的分配是错误的,因为你通过 typedefing 一个指针让它变得混乱,不要那样做

    n = malloc(sizeof(*n));
    

    不容易出错。

  2. 查看malloc()的return值,不需要强制转换,所以

    n = malloc(sizeof(*n));
    if (n == NULL)
        return NULL;
    
  3. 您正在打印 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);
    
  4. 你没有函数原型,所以你的编译器使用隐式函数声明,这是不好的,因为它会假定所有函数 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() 分配更改为指针指向的大小。