gpt4 book ai didi

c - 运行程序时出现段错误(核心转储)

转载 作者:行者123 更新时间:2023-11-30 18:58:25 26 4
gpt4 key购买 nike

#include<stdio.h>
#include<string.h>
#include<malloc.h>
//#include<conio.h>
struct list
{
char *value;
struct list *link;
};
struct list *arr[12];int val;
int hf(char *item)
{
int sum,i=0;
while(item[i]!='\0')
{
sum+=item[i];
i++;
}
return sum%12;
}
void insert(struct list ** arr,char *item,int val)
{
struct list *temp,*r;
r=*arr;
temp=(struct list *)malloc(sizeof(struct list));
strcpy((temp->value),item);
if(strcmp((r->value),NULL))
{
strcpy((r->value),(temp->value));
(r->link)=NULL;
}
else
{
while(r->link!=NULL)
r=r->link;
r->link=temp;
r=r->link;
strcpy((r->value),(temp->value));
r->link=NULL;

}
*arr=r;

}
void main()
{
struct list *li[12];int i=0;
for(i=0;i<12;i++)
{
li[i]=NULL;
}
char *item;int ret;
strcpy(item,"Steve");
ret=hf(item);
insert(&li[ret],item,ret);
strcpy(item,"raj");
ret=hf(item);
insert(&li[ret],item,ret);
strcpy(item,"Notes");
ret=hf(item);
insert(&li[ret],item,ret);
}

上面的程序是实现链表数组,我试图插入字符串作为值。当我尝试运行该程序时,没有错误,但它告诉段错误(核心已转储)所以请解释一下原因

最佳答案

代码

char *item;int ret;
strcpy(item,"Steve");

尝试将字符串文字“Steve”复制到未初始化的指针。您需要为item分配内存。最简单的方法是硬编码一个适当大小的堆栈缓冲区

char item[50];

您在insert中也有类似的问题。你可以用同样的方法解决这个问题

struct list
{
char value[50];
struct list *link;
};

或者您可以在insert内动态分配正确大小的缓冲区

temp->value = malloc(strlen(item) + 1);
if (temp->value == NULL) {
/* handle oom error */
}
strcpy(temp->value, item);

在后一种方法中,请确保在释放该列表节点时free(node->value)。另请注意,您的程序当前缺少释放所有动态分配的内存,这意味着您泄漏了使用 malloc 分配的所有内存。

您的代码中还有一个错误 - insert 假定 arr 是指向有效 list* 的指针,但它始终是 NULL。您需要更新 maininsert 中的假设。

关于c - 运行程序时出现段错误(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16479246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com