-1
#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); 
} 

上面的程序是实现链表和数组,试图插入字符串 作为值。当我试图运行的程序,没有任何错误,但它告诉分段错误(核心转储) 所以请说明理由运行程序时出现分段错误(核心转储)

+3

的输出请注意,您的HF()函数可以返回一个负值。对散列值,大小和索引使用无符号类型是一种好习惯。另外:2)main()应该返回int,3)不要使用malloc()的返回值,4)不要使用太多不需要的'()'括号。 5)使用一些空白,特别是在操作员周围。顺便说一下,你的'insert(&li [ret],item,ret);'应该检查是否(ret> = 0 && ret <12)' – wildplasser 2013-05-10 09:49:47

回答

2

代码

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这里的假设。

+0

item =(char *)malloc(sizeof(char));仍然错误 – 2013-05-10 09:39:43

+0

即使我尝试项目[50]仍然显示相同的错误。在插入函数中是否存在漏洞 – 2013-05-10 09:42:18

+0

您的第一条评论会分配一个1字符缓冲区,然后尝试将6个字符串写入。你的第二个评论应该修复第一个错误,但会在以后的错误中失败。有关详细信息,请参阅我的更新回答 – simonc 2013-05-10 09:42:20

0

变化以下

在插入件()函数改变,如果环路

if(r==NULL){ 
    r = temp; 
} 

变化的结构。变量项目改变结构的大小以适合您的需要

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

更改为

焦炭项目[25]。

编辑: 没有必要强制转换的malloc

+0

循环是什么? – 2013-05-10 10:48:05

+0

未将任何内存分配给struct list * r。所以我们必须引用新的节点。否则在复制时会显示分段错误 – sujin 2013-05-10 10:53:51

相关问题