runtime error: null pointer passed as argument 1, which is declared to never be null
runtime error: null pointer passed as argument 1, which is declared to never be null
我编写了一个程序来创建具有两个值的链表。
它在我只有 int 值时有效,但现在我添加了 char* 此错误消息显示
运行时间错误:作为参数 1 传递的空指针被声明为永远不会为空
如前所述,在我将 char* 添加到构造函数和结构之前,它工作正常。不确定哪里出了问题,因为每次我 运行 错误似乎都来自代码中的不同行...那么我需要更改什么?
#include <stdio.h>
#include <cs50.h>
#include <string.h>
typedef struct node {
int val;
char* name;
struct node *next;
} node_t;
void addFirst(int value, char* word, node_t** nd) {
//initialize new node, allocate space, set value
node_t * tmp;
tmp = malloc(sizeof(node_t));
tmp->val = value;
strcpy(tmp->name, word);
//let the new nodes next pointer point to the old head
tmp->next = *nd;
//Make tmp the head node
*nd = tmp;
}
int findItem(int value,char* word, node_t *nd) {
if(nd->val == value)
return 0;
while(nd->next != NULL) {
if(nd->val == value && strcmp(word, nd->name) == 0)
return 0;
if(nd->next != NULL)
nd = nd->next;
}
return -1;
}
int main (void) {
node_t *head = malloc(sizeof(node_t));
head->val = 0;
strcpy(head->name, "");
head->next = NULL;
addFirst(15, "word", &head);
addFirst(14,"word2", &head);
printf("%i \n", findItem(15, "word", head));
}
问题出在strcpy(head->name, "");
。在这里,您正在尝试使用 head->name
指向的内存位置指针,但您从未为其分配有效内存。
在写入/读取该内存位置之前,您需要确保指针指向有效的内存位置。尝试访问无效内存调用 undefined behavior。
这也适用于 name
的其他未初始化实例。
如果您可以使用 POSIX 标准,而不是 strcpy()
,您可以使用 strdup()
我编写了一个程序来创建具有两个值的链表。 它在我只有 int 值时有效,但现在我添加了 char* 此错误消息显示 运行时间错误:作为参数 1 传递的空指针被声明为永远不会为空
如前所述,在我将 char* 添加到构造函数和结构之前,它工作正常。不确定哪里出了问题,因为每次我 运行 错误似乎都来自代码中的不同行...那么我需要更改什么?
#include <stdio.h>
#include <cs50.h>
#include <string.h>
typedef struct node {
int val;
char* name;
struct node *next;
} node_t;
void addFirst(int value, char* word, node_t** nd) {
//initialize new node, allocate space, set value
node_t * tmp;
tmp = malloc(sizeof(node_t));
tmp->val = value;
strcpy(tmp->name, word);
//let the new nodes next pointer point to the old head
tmp->next = *nd;
//Make tmp the head node
*nd = tmp;
}
int findItem(int value,char* word, node_t *nd) {
if(nd->val == value)
return 0;
while(nd->next != NULL) {
if(nd->val == value && strcmp(word, nd->name) == 0)
return 0;
if(nd->next != NULL)
nd = nd->next;
}
return -1;
}
int main (void) {
node_t *head = malloc(sizeof(node_t));
head->val = 0;
strcpy(head->name, "");
head->next = NULL;
addFirst(15, "word", &head);
addFirst(14,"word2", &head);
printf("%i \n", findItem(15, "word", head));
}
问题出在strcpy(head->name, "");
。在这里,您正在尝试使用 head->name
指向的内存位置指针,但您从未为其分配有效内存。
在写入/读取该内存位置之前,您需要确保指针指向有效的内存位置。尝试访问无效内存调用 undefined behavior。
这也适用于 name
的其他未初始化实例。
如果您可以使用 POSIX 标准,而不是 strcpy()
,您可以使用 strdup()