链表中的Char数组导致核心转储

时间:2015-02-16 17:03:21

标签: c arrays linked-list strcpy

我创建了一个链接列表程序,它与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数组

感谢

3 个答案:

答案 0 :(得分:1)

问题在于这个分配:

malloc(sizeof(list))

它显示了制作指针的类型别名的问题,因为这里只分配指针的大小而不是整个结构。

答案 1 :(得分:0)

  1. 您的分配是错误的,因为您通过typedef指针使其混乱,不要这样做

    n = malloc(sizeof(*n));
    

    不易出错。

  2. 检查malloc()的返回值,不需要演员表,所以

    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. 你没有函数原型,所以你的编译器使用隐式函数声明,这很糟糕,因为它会假设所有函数都返回int,所以你需要在定义之前添加这些函数main()

    list createList();
    list insert_start(list l1, char val[]);
    void showList(list l1);
    

    特别是前两个非常重要,启用编译器警告来防止这种情况。

  5. 这是您修改的代码:

    #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()分配更改为指针指向的大小。