コンパイルは通るのですがエラーが出て実行できない。とりあえずわかる範囲でデバッグしてみました。
エラーの箇所は実行結果に示してあります。。どう直せばいいかがわかりません。
コード #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define N 256 #define FILENAME "address.csv" struct address{ char number[N]; char name[N]; // 名前 char address[N]; // 住所 char tel[N]; // 電話 struct address *before; // ソートに必要である ,前のリスト struct address *next; // 次のリスト }; void list_add(struct address **ap,char *number, char *name, char *address, char *tel) { struct address *p; if ((p = malloc(sizeof(struct address))) != 0) { strcpy(p->number, number); strcpy(p->name, name); strcpy(p->address, address); strcpy(p->tel, tel); p->next = *ap; // *apの先頭アドレスをポインタpのp->nextに代入する。 // p->nextはstruct address *pの中で次のリストをしめしている。 // ポインタpの次のリストに追加したいstruct address **apの先頭アドレスを代入する。 // *apはheadである。 printf("p:%p\tnext3: %p\tbefore: %p \t*ap: %p\n", p, p->next, p->before,*ap); if (p->next != 0) // 代入された*apの先頭アドレスが0でないならば printf("p:%p\tnext3: %p\tbefore: %p\n", p, p->next, p->before); p->next->before = p; printf("p:%p\tnext3: %p\tbefore: %p\n", p, p->next, p->before); p->before = 0; // *apをheadにするために次のリストのp->beforeを0にしている。 printf("p:%p\tnext3: %p\tbefore: %p\n", p, p->next, p->before); *ap = p; // *apをheadにしている。 printf("p:%p\tnext3: %p\tbefore: %p \t*ap: %p\n", p, p->next, p->before,*ap); } } void release(struct address **ap) { if (*ap != 0) { release(&((*ap)->next)); free(*ap); *ap = 0; } } void chop(char *p) { for (; *p; p++) ; p--; while (*p == '\r' || *p == '\n') *(p--) = 0; } int main(void) { struct address *ap; FILE* fp; static char buff[N],number[N], name[N], address[N], tel[N]; char *token=","; ap = 0; if ((fp = fopen(FILENAME,"r")) != 0) { while(fgets(buff, N, fp) != 0){ chop(buff); strcpy(number, strtok(buff, token)); strcpy(name, strtok(NULL, token)); strcpy(address, strtok(NULL, token)); strcpy(tel, strtok(NULL, token)); list_add(&ap,number,name, address, tel); } fclose(fp); } release(&ap); return 0; } /* 実行結果 とりあえずわかる範囲でデバッグしてみました。 エラーの箇所は以下で起きています。どう直せばいいかがわかりません。 main () at list_add.c:75 75 strcpy(number, strtok(buff, token)); (gdb) 76 strcpy(name, strtok(NULL, token)); (gdb) 77 strcpy(address, strtok(NULL, token)); (gdb) 78 strcpy(tel, strtok(NULL, token)); (gdb) Program received signal SIGSEGV, Segmentation fault. 0x77915633 in strcat () from C:\WINDOWS\SysWOW64\msvcrt.dll (gdb) */
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/27 11:34
2017/11/27 11:51 編集
2017/11/27 11:57
2017/11/27 12:13 編集