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

上記のプログラムは、リンクされたリストの配列を実装し、文字列を値として挿入しようとしています。プログラムを実行しようとすると、エラーは発生しませんが、セグメンテーション違反 (コア ダンプ) が表示されるので、理由を説明してください

4

2 に答える 2

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

あなたのコードにはもう 1 つのバグinsertarrありlist*ますNULLmainここで、または仮定のいずれかを更新する必要がありinsertます。

于 2013-05-10T09:36:36.537 に答える