link 列表分段错误
link list segmentation fault
typedef struct node{
int data;
struct node *link;
}nd;
nd *head=NULL , *ahead=NULL;
void create_node(int item) {
nd *new, *temp;
new = (nd*)malloc(sizeof(nd));
new->data=item;
new->link=NULL;
if(head==NULL) {
head=new;
}
else {
temp=head;
while(temp->link!=NULL) {
temp=temp->link;
}
temp->link=new;
}
}
void alpha_check(int size) {
int i,j,num;
nd *ti , *tj;
ti=tj=head;
for(i=1 ; i<=size ; i++) {
for(j=1 ; j<=size ; j++) {
num = ((ti->data)*10)+(tj->data);
tj=tj->link;
/*if(num>=65 && num<=90) {
printf("\n->%d",num);
}*/
}
//ti=ti->link;
}
}
void traverse(nd *thead) {
while(thead->link!=NULL) {
printf("%d ",thead->data);
thead=thead->link;
}
printf("%d ",thead->data);
}
所以上面代码中唯一的问题在于函数 alpha_check() 我想要变量 tj指向下一个节点。它没有指向下一个节点,而是给我 Segmentation fault (core dumped)。
请解释为什么我不能让 tj 指向下一个节点。
段错误是向内核发出的信号,表明您的程序正在访问内存,但它没有权限导致内核终止您的程序。这通常意味着您超出了数组的边界,或者在您的情况下,您正在取消引用指向不应该指向的东西的指针。就像其他人在他们的评论中提到的那样,您在遍历链表时需要具有与遍历数组时不同类型的约束。您需要在检查节点指针不为 NULL 的同时进行遍历,而不是在 for 循环中执行一些固定大小。
我已经对您的 alpha_check 程序进行了更改,并添加了一个 main 用于测试它。正如您所期望的那样工作。
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* link;
} nd;
nd *head=NULL , *ahead=NULL;
void create_node(int item) {
nd* new,* temp;
new = (nd*)malloc(sizeof(nd));
new->data = item;
new->link = NULL;
printf("%d %p\n", new->data, new);
if(head == NULL) {
head = new;
}
else {
temp = head;
while(temp->link)
temp = temp->link;
temp->link = new;
}
}
void alpha_check(int size) {
int i,j,num;
nd* ti ,* tj;
ti = tj = head;
for(i = 1 ; i <= size ; i++) {
while(tj) {
num = ti->data * 10 + tj->data;
tj = tj->link;
//if(num>=65 && num<=90)
//{
printf("\n->%d",num);
printf(" %p\n", tj);
//}
}
//ti=ti->link;
}
}
void traverse(nd* thead) {
while(thead->link) {
printf("%d ", thead->data);
thead = thead->link;
}
printf("%d ", thead->data);
}
int main(void) {
create_node(10);
create_node(1);
create_node(5);
alpha_check(2);
return 0;
}
typedef struct node{
int data;
struct node *link;
}nd;
nd *head=NULL , *ahead=NULL;
void create_node(int item) {
nd *new, *temp;
new = (nd*)malloc(sizeof(nd));
new->data=item;
new->link=NULL;
if(head==NULL) {
head=new;
}
else {
temp=head;
while(temp->link!=NULL) {
temp=temp->link;
}
temp->link=new;
}
}
void alpha_check(int size) {
int i,j,num;
nd *ti , *tj;
ti=tj=head;
for(i=1 ; i<=size ; i++) {
for(j=1 ; j<=size ; j++) {
num = ((ti->data)*10)+(tj->data);
tj=tj->link;
/*if(num>=65 && num<=90) {
printf("\n->%d",num);
}*/
}
//ti=ti->link;
}
}
void traverse(nd *thead) {
while(thead->link!=NULL) {
printf("%d ",thead->data);
thead=thead->link;
}
printf("%d ",thead->data);
}
所以上面代码中唯一的问题在于函数 alpha_check() 我想要变量 tj指向下一个节点。它没有指向下一个节点,而是给我 Segmentation fault (core dumped)。 请解释为什么我不能让 tj 指向下一个节点。
段错误是向内核发出的信号,表明您的程序正在访问内存,但它没有权限导致内核终止您的程序。这通常意味着您超出了数组的边界,或者在您的情况下,您正在取消引用指向不应该指向的东西的指针。就像其他人在他们的评论中提到的那样,您在遍历链表时需要具有与遍历数组时不同类型的约束。您需要在检查节点指针不为 NULL 的同时进行遍历,而不是在 for 循环中执行一些固定大小。
我已经对您的 alpha_check 程序进行了更改,并添加了一个 main 用于测试它。正如您所期望的那样工作。
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* link;
} nd;
nd *head=NULL , *ahead=NULL;
void create_node(int item) {
nd* new,* temp;
new = (nd*)malloc(sizeof(nd));
new->data = item;
new->link = NULL;
printf("%d %p\n", new->data, new);
if(head == NULL) {
head = new;
}
else {
temp = head;
while(temp->link)
temp = temp->link;
temp->link = new;
}
}
void alpha_check(int size) {
int i,j,num;
nd* ti ,* tj;
ti = tj = head;
for(i = 1 ; i <= size ; i++) {
while(tj) {
num = ti->data * 10 + tj->data;
tj = tj->link;
//if(num>=65 && num<=90)
//{
printf("\n->%d",num);
printf(" %p\n", tj);
//}
}
//ti=ti->link;
}
}
void traverse(nd* thead) {
while(thead->link) {
printf("%d ", thead->data);
thead = thead->link;
}
printf("%d ", thead->data);
}
int main(void) {
create_node(10);
create_node(1);
create_node(5);
alpha_check(2);
return 0;
}