C中的新结构Linked-List可以编译但不能执行

时间:2018-01-27 06:37:47

标签: c

我想在struct data中存储一个新的LList,数据类型包含一个字符串,这段代码可以编译,但是当我执行它时,它只返回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);
}

3 个答案:

答案 0 :(得分:1)

  

我的代码出了什么问题?

那是什么:

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

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

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

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

当将随机数作为地址引用时,程序将从操作系统请求程序应该没有业务的内存区域。操作系统将识别它,发出"分段故障"错误(文学意味着 - "你不在你的记忆片段,伙伴和#34;)并终止你的过程。

答案 1 :(得分:0)

当前的问题在于

Data *v;

首先你需要为它分配一些内存,即在assert put

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

答案 2 :(得分:0)

或者更改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调用。