EXC_BAD 在 C 中将节点添加到链表时访问
EXC_BAD ACCESS when adding node to linked list in C
我正在尝试实现一个函数以在链表的末尾添加一个新节点,发现 here。但是,当 运行 Xcode 中下面的代码时,我在标有注释 //ERROR
的 if 语句处收到 EXC_BAD_ACCESS 错误
这是我第一次认真接触链表,谁能解释一下我做错了什么?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _node {
int value;
struct _node *next;
} node;
int addNodeBottom(int val, node *head);
int main(int argc, const char * argv[]) {
node *head;
head = NULL;
for (int i = 1; i<11; i++) {
addNodeBottom(i, head);
}
node *temp = head;
while (head != NULL) {
head = temp->next;
free(temp);
temp = head;
}
return 0;
}
int addNodeBottom(int val, node *head){
//create new node
node *newNode = (node*)malloc(sizeof(node));
if(newNode == NULL){
fprintf(stderr, "Unable to allocate memory for new node\n");
exit(-1);
}
newNode->value = val;
newNode->next = NULL;
//check for first insertion
if(head->next == NULL){ //ERROR
head->next = newNode;
printf("added at beginning\n");
}
else {
//else loop through the list and find the last
//node, insert next to it
node *current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
printf("added later\n");
}
return 0;
}
问题在于您取消引用了指向 NULL
的指针。见这里 main
—
head = NULL;
但是在函数中,您取消引用它 —
if(head->next == NULL){ //ERROR
而不检查 head
是否为 NULL
。当 head
为 NULL
时处理,如果不是 NULL
则继续。
head = NULL;
...
if(head->next == NULL)
因为这个。您应该首先将 head 初始化为有效指针。您的问题的可能解决方案是将 node** head
传递给函数而不是 node* headPtr
并检查 *headPtr == NULL
以便可以使用 head = NULL
.
我正在尝试实现一个函数以在链表的末尾添加一个新节点,发现 here。但是,当 运行 Xcode 中下面的代码时,我在标有注释 //ERROR
的 if 语句处收到 EXC_BAD_ACCESS 错误这是我第一次认真接触链表,谁能解释一下我做错了什么?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _node {
int value;
struct _node *next;
} node;
int addNodeBottom(int val, node *head);
int main(int argc, const char * argv[]) {
node *head;
head = NULL;
for (int i = 1; i<11; i++) {
addNodeBottom(i, head);
}
node *temp = head;
while (head != NULL) {
head = temp->next;
free(temp);
temp = head;
}
return 0;
}
int addNodeBottom(int val, node *head){
//create new node
node *newNode = (node*)malloc(sizeof(node));
if(newNode == NULL){
fprintf(stderr, "Unable to allocate memory for new node\n");
exit(-1);
}
newNode->value = val;
newNode->next = NULL;
//check for first insertion
if(head->next == NULL){ //ERROR
head->next = newNode;
printf("added at beginning\n");
}
else {
//else loop through the list and find the last
//node, insert next to it
node *current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
printf("added later\n");
}
return 0;
}
问题在于您取消引用了指向 NULL
的指针。见这里 main
—
head = NULL;
但是在函数中,您取消引用它 —
if(head->next == NULL){ //ERROR
而不检查 head
是否为 NULL
。当 head
为 NULL
时处理,如果不是 NULL
则继续。
head = NULL;
...
if(head->next == NULL)
因为这个。您应该首先将 head 初始化为有效指针。您的问题的可能解决方案是将 node** head
传递给函数而不是 node* headPtr
并检查 *headPtr == NULL
以便可以使用 head = NULL
.