创建链表时出现分段错误
Segmentation fault while creating a linked list
我正在编写一个小程序,将数据和密钥存储在链表结构中,并根据用户的密钥检索数据。该程序还检查它是否是唯一键,如果是,它通过在列表的前面创建一个节点来存储数据。但是下面的代码总是抛出分段错误。
#include<stdlib.h>
/* Node having data, unique key, and next */.
struct node
{
int data;
int key;
struct node *next;
}*list='[=10=]',*p;
/* Create a node at the front */
void storeData(int data_x,int key_x)
{
int check_key;
position *nn; //nn specifies newnode
nn=(position)malloc(sizeof(struct node));
/* Segmentation Fault occurs here */
if(list->next==NULL)
{
nn->next=list->next;
nn->data = data_x;
nn->key = key_x;
list->next = nn;
}
else
{
check_key=checkUniqueKey(key_x);
if(check_key != FALSE)
{
printf("The entered key is not unique");
}
else
{
nn->data = data_x;
nn->key = key_x;
nn->next=list->next;
list->next=nn;
}
}
}
/* Retreive data based on a key */
int retreiveData(int key_find)
{
int ret_data = NULL;
p=list->next;
while(p->next != NULL)
{
if(p->key == key_find)
{
ret_data = p->data;
break;
}
p=p->next;
}
return(ret_data);
}
/* Checks whether user key is unique */
int checkUniqueKey(int key_x)
{
int key_check = FALSE;
p=list->next;
while(p->next != NULL)
{
if(p->key == key_x)
{
key_check = TRUE;
break;
}
p=p->next;
}
return(key_check);
}
动态分配后storeData
函数出现段错误。
您尝试将您的地址投射到仓位结构而不是仓位*
nn=(position)malloc(sizeof(struct node));
使用 gcc 标志 -Wextra 和 -Wall 编译您的代码以防止此类问题。
此外,我不知道这是不是一个错误,但 malloc 是一个结构节点的大小,而你的 nn 变量是一个位置指针。
当您初始化 list
指针时,您将其设置为 NULL(如“\0”),当程序访问地址 0x00 时,它超出了它的边界并且操作系统终止了该进程。
为了避免段错误,您可以使用 "list" 非指针类型,从而在堆栈上进行分配,当您想要将列表作为指针访问时,您可以执行 &list
。另一种解决方案将涉及在堆栈 "root_node" 上设置变量并将 list
指针初始化为 list = &root_node
。
您的代码中存在一些问题:
您的列表处理有缺陷:您总是取消引用全局指针 list
,甚至在创建任何列表项之前也是如此。您应该通过比较 list
和 NULL
.
来测试列表是否为空
类型 position
未定义。避免将指针隐藏在 typedef 后面,这是造成混淆的一个重要原因,这解释了您对列表指针的错误处理。
避免定义名称为 p
的全局变量,无论如何都不需要。在使用它的函数中将 p
定义为局部变量。
NULL
是空指针,0
零整数值,[=19=]
C 字符串末尾的空字节。所有 3 个都计算为 0
但并不总是可以互换的。
为了更好的可移植性和可读性,请针对每种情况使用适当的一种。
这是一个改进版本:
#include <stdio.h>
#include <stdlib.h>
/* Node having data, unique key, and next */.
struct node {
int data;
int key;
struct node *next;
} *list;
/* Create a node at the front */
void storeData(int data_x, int key_x) {
if (checkUniqueKey(key_x)) {
printf("The entered key is not unique\n");
} else {
/* add a new node to the list */
struct node *nn = malloc(sizeof(struct node));
if (nn == NULL) {
printf("Cannot allocate memory for node\n");
return;
}
nn->data = data_x;
nn->key = key_x;
nn->next = list;
list = nn;
}
}
/* Retrieve data based on a key */
int retrieveData(int key_find) {
struct node *p;
int ret_data = 0;
for (p = list; p != NULL; p = p->next) {
if (p->key == key_find) {
ret_data = p->data;
break;
}
}
return ret_data;
}
/* Checks whether user key is unique */
int checkUniqueKey(int key_x) {
struct node *p;
int key_check = FALSE;
for (p = list; p != NULL; p = p->next) {
if (p->key == key_x) {
key_check = TRUE;
break;
}
}
return key_check;
}
我正在编写一个小程序,将数据和密钥存储在链表结构中,并根据用户的密钥检索数据。该程序还检查它是否是唯一键,如果是,它通过在列表的前面创建一个节点来存储数据。但是下面的代码总是抛出分段错误。
#include<stdlib.h>
/* Node having data, unique key, and next */.
struct node
{
int data;
int key;
struct node *next;
}*list='[=10=]',*p;
/* Create a node at the front */
void storeData(int data_x,int key_x)
{
int check_key;
position *nn; //nn specifies newnode
nn=(position)malloc(sizeof(struct node));
/* Segmentation Fault occurs here */
if(list->next==NULL)
{
nn->next=list->next;
nn->data = data_x;
nn->key = key_x;
list->next = nn;
}
else
{
check_key=checkUniqueKey(key_x);
if(check_key != FALSE)
{
printf("The entered key is not unique");
}
else
{
nn->data = data_x;
nn->key = key_x;
nn->next=list->next;
list->next=nn;
}
}
}
/* Retreive data based on a key */
int retreiveData(int key_find)
{
int ret_data = NULL;
p=list->next;
while(p->next != NULL)
{
if(p->key == key_find)
{
ret_data = p->data;
break;
}
p=p->next;
}
return(ret_data);
}
/* Checks whether user key is unique */
int checkUniqueKey(int key_x)
{
int key_check = FALSE;
p=list->next;
while(p->next != NULL)
{
if(p->key == key_x)
{
key_check = TRUE;
break;
}
p=p->next;
}
return(key_check);
}
动态分配后storeData
函数出现段错误。
您尝试将您的地址投射到仓位结构而不是仓位*
nn=(position)malloc(sizeof(struct node));
使用 gcc 标志 -Wextra 和 -Wall 编译您的代码以防止此类问题。
此外,我不知道这是不是一个错误,但 malloc 是一个结构节点的大小,而你的 nn 变量是一个位置指针。
当您初始化 list
指针时,您将其设置为 NULL(如“\0”),当程序访问地址 0x00 时,它超出了它的边界并且操作系统终止了该进程。
为了避免段错误,您可以使用 "list" 非指针类型,从而在堆栈上进行分配,当您想要将列表作为指针访问时,您可以执行 &list
。另一种解决方案将涉及在堆栈 "root_node" 上设置变量并将 list
指针初始化为 list = &root_node
。
您的代码中存在一些问题:
您的列表处理有缺陷:您总是取消引用全局指针
list
,甚至在创建任何列表项之前也是如此。您应该通过比较list
和NULL
. 来测试列表是否为空
类型
position
未定义。避免将指针隐藏在 typedef 后面,这是造成混淆的一个重要原因,这解释了您对列表指针的错误处理。避免定义名称为
p
的全局变量,无论如何都不需要。在使用它的函数中将p
定义为局部变量。NULL
是空指针,0
零整数值,[=19=]
C 字符串末尾的空字节。所有 3 个都计算为0
但并不总是可以互换的。 为了更好的可移植性和可读性,请针对每种情况使用适当的一种。
这是一个改进版本:
#include <stdio.h>
#include <stdlib.h>
/* Node having data, unique key, and next */.
struct node {
int data;
int key;
struct node *next;
} *list;
/* Create a node at the front */
void storeData(int data_x, int key_x) {
if (checkUniqueKey(key_x)) {
printf("The entered key is not unique\n");
} else {
/* add a new node to the list */
struct node *nn = malloc(sizeof(struct node));
if (nn == NULL) {
printf("Cannot allocate memory for node\n");
return;
}
nn->data = data_x;
nn->key = key_x;
nn->next = list;
list = nn;
}
}
/* Retrieve data based on a key */
int retrieveData(int key_find) {
struct node *p;
int ret_data = 0;
for (p = list; p != NULL; p = p->next) {
if (p->key == key_find) {
ret_data = p->data;
break;
}
}
return ret_data;
}
/* Checks whether user key is unique */
int checkUniqueKey(int key_x) {
struct node *p;
int key_check = FALSE;
for (p = list; p != NULL; p = p->next) {
if (p->key == key_x) {
key_check = TRUE;
break;
}
}
return key_check;
}