我想在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);
}
答案 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调用。