C语言中的新结构链表,可以编译但不能执行



我想在LList中存储一个新的struct data,数据类型包含一个字符串,这段代码可以编译,但是当我执行它时,它只是返回list.exe has stopped working。我的代码有什么问题?

typedef struct data{
    int vertex;
    char url[10];   
}Data;

typedef struct Node {
   Data         *v;
   struct Node *next; 
} Node;
Node *makeNode(Data n) {
   Node *new_node = (Node*)malloc(sizeof(Node));
   assert(new_node != NULL);
   new_node->v->vertex = n.vertex;
   strcpy(new_node->v->url,n.url);
   new_node->next = NULL;
   return new_node;
}
int main(){
    Data n1;
    n1.vertex = 1;
    strcpy(n1.url,"a1");;
    Node *a = makeNode(n1);
}

我的代码有什么问题?

这就是:

  new_node->v->vertex = n.vertex;

特别是,您取消引用 new_node->v 就像它是一个合法地址,而它是一个随机值。因为这行:

   Node *new_node = (Node*)malloc(sizeof(Node));

malloc(( 确实为你分配了new_node,但它是一个充满随机剩余字节的内存区域,所以 new_node->v 此时只是来自 PC RAM 的随机二进制序列。

当引用随机数作为地址时,您的程序将从操作系统请求您的程序不应与之相关的内存区域。操作系统将识别它,发出"分段错误"错误(文学手段 - "你没有内存段,伙计"(并终止您的进程。

直接的问题是

Data *v;

首先,您需要为其分配一些内存,即在assert放置后立即分配

new_node->v=malloc(sizeof *(new_node->v))
if(NULL==new_node->v)
    perror("Pgm failed");

或者更改 Node 结构以包含 Data 结构的实例,而不是指向它的指针:

typedef struct Node {
   Data         v;         // <---    got rid of *
   struct Node *next; 
} Node;

此外,您可以从以下位置稍微清理一下您的 malloc:

Node *new_node = (Node*)malloc(sizeof(Node));

Node *new_node = malloc(sizeof(*new_node));

无需从 malloc(( 强制转换返回,并且通过使用 *new_node 作为大小,如果 new_node 的类型发生变化,则不必更改 malloc 调用。

最新更新