我的代码采用一串由空格分隔的整数,并根据它们构建一个链表,但-1除外。为什么打印nextNode -> data
会导致段错误?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node Node;
struct node {
int data;
Node *next;
};
void build_linked_list(Node **head_ptr) {
char *string = malloc(1028);
char *p = string, *found = string;
Node *nextNode = NULL;
if (fgets(string, 1028, stdin) != NULL) {
while ((found = strsep(&p, " \n")) != NULL) {
if (strcmp(found, "-1") == 1) {
Node *node = malloc(sizeof(Node));
node->data = atoi(found);
node->next = nextNode;
nextNode = node;
}
}
}
*head_ptr = nextNode;
printf("%i\n", nextNode->data); //error here
free(string);
}
int main() {
Node *head = NULL;
build_linked_list(&head);
return EXIT_SUCCESS;
}
答案 0 :(得分:1)
无论如何,您都尝试打印nextNode->data
,但是如果nextNode
是NULL
怎么办?尝试访问无效指针的成员将导致分段错误。
详细信息:
您初始化指向NULL
Node *nextNode = NULL;
您更新了指针,但仅在某些条件下:
if (fgets(string, 1028, stdin) != NULL) {
while ((found = strsep(&p, " \n")) != NULL) {
if (strcmp(found, "-1") == 1) {
/* ... */
nextNode = node;
}
}
}
您打印字段
printf("%i\n", nextNode->data); //error here
但是如果不满足条件,则指针可能仍为NULL
要解决此问题,请在取消引用之前检查指针:
if( nextNode )
{
printf("%i\n", nextNode->data);
}
else
{
printf("NULL nextnode\n");
}
答案 1 :(得分:1)
在阅读nextNode != NULL
之前,您没有检查nextNode->data
是否是>
strcmp()返回表示比较结果的整数, 如下:
· 0, if the s1 and s2 are equal; · a negative value if s1 is less than s2; · a positive value if s1 is greater than s2.
两个字符串不同时从strcmp()
返回的内容不必是1
,因此strcmp(found, "-1") == 1
是一个错误的表达式,用于检查found
是否不是{{1} }。
您的环境中似乎-1
返回的是strcmp()
以外的东西,并且没有执行插入操作,因此1
在NULL
处取消引用,从而导致分段错误。
尝试一下:
nextNode->data