質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

198閲覧

C言語のsegmetation fault :11について

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/07/17 14:45

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

ハッシュテーブルに追加してその中にある名前で検索するプログラムです
###発生している問題・エラーメッセージ
segmentation fault :11

エラーメッセージ

###該当のソースコード

ここにご自身が実行したソースコードを書いてください

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define HASH_SIZE 3

typedef struct date{
char *name;
struct date *next;
}LIST;

int hash(char *ps);
void add_list(LIST *ht[],LIST *s);
char *findhash(LIST *ht[],char *findname);

int main(void){
int i;
char *findname="mutoh";

LIST *ht[HASH_SIZE];
LIST *p;
LIST s[6]={
{"yamada",NULL},
{"kawada",NULL},
{"mutoh",NULL},
{"amano",NULL},
{"fukuda",NULL},
};

for(i=0;i<HASH_SIZE;i++) ht[i]=NULL;
for(i=0;i<6;i++) add_list(ht,&s[i]);
for(i=0;i<HASH_SIZE;i++){
for(p=ht[i];p!=NULL;p=p->next) printf("%s\t",p->name);
printf("%d\n",i);
}
printf("There is %s\n",findhash(ht,findname));
return 0;
}

int hash(char *ps){
int total;
while(*ps!='\0') total+=*ps++;
return total%HASH_SIZE;
}

void add_list(LIST *ht[],LIST *padd){
int hvalue;
LIST *p;

hvalue=hash(padd->name);
if(ht[hvalue]==NULL)
ht[hvalue]=padd;
else{
p=ht[hvalue];
ht[hvalue]=padd;
padd->next=p;
}
}

char *findhash(LIST *ht[],char *findname){
int hvalue;
LIST *p;

hvalue=hash(findname);
p=ht[hvalue];
if(strcmp(p->name,findname)==0) return p->name;
while(p->next!=NULL){
p=p->next;
if(strcmp(p->name,findname)==0) return p->name;
}
return NULL;
}
###試したこと
課題に対してアプローチしたことを記載してください
打ち間違いがないか確認した。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
C言語
mac os

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

C

1List s[6]={ 2 {"yamada",NULL}, 3 {"kawada",NULL}, 4 {"mutoh",NULL}, 5 {"amano",NULL}, 6 {"fukuda",NULL}, 7}

...

for(i=0;i<6;i++) add_list(ht,&s[i]); // ←ここ!

存在しないs[5]を参照しているからです。
ここを修正したら、また別のエラーが出ましたが...

重要

質問でソースコードを貼る際は、バッククオート三つで括ってください。
よくわからない場合は、マークダウン記法について調べてみてください。

投稿2017/07/17 14:59

編集2017/07/17 15:00
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/17 15:03

i<5にすることでエラーなくなりました。 アドバイスありがとうございます
LouiS0616

2017/07/17 15:08

sizeof(s)/sizeof(s[0]) の方が柔軟な気もします。ご検討ください。
LouiS0616

2017/07/17 15:10

あと、マークダウン記法は今からでも適用してください。 このサイトの目的の一つに、ノウハウの蓄積がありますから、後から見た人のために見やすくしておいてくださいね。
guest

0

hash関数内のlvalue未初期化、多分これが原因です。

投稿2017/07/17 14:56

majiponi

総合スコア1720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/17 15:01

ありがとうございます!
majiponi

2017/07/17 15:08

どうも間違っていたようでごめんなさい。hashが正しく作成できてないせいで、findhash関数がNULLを返して、それでバグっているのかと思いましたが、もっと前で止まってたんですね…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問