我想在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 调用。