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

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

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

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

Q&A

解決済

2回答

3970閲覧

NULLポインタを逆参照しています。を解決したいです。

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2019/11/14 04:18

編集2019/11/14 04:25

前提・実現したいこと

C言語で住所録を作成しています。
csvファイルを読み込んだあと、mallocで確保したノードに格納しています。
追加や編集、削除をした後にまたファイルに頭から書き込みなおします。
その際に名前の昇順でソートし保存したいです。

エラー箇所は!!!!!!で囲んだところです。

発生している問題・エラーメッセージ

C6011 NULL ポインター 'head' を逆参照しています。 C28182 NULL ポインターを逆参照しています。'index' には、'head' と同じ NULL 値が含まれます。これが行われる可能性のある以前の行 118 を参照してください C4133 '=': 'data *' と 'data *' の間で型に互換性がありません。

該当のソースコード

[address.3.h] #ifndef _ADDRESS3_H_ #define _ADDRESS3_H_ #define NAME_SIZE 100 #define TEL_SIZE 100 #define ADDRESS_SIZE 100 typedef struct { char name[NAME_SIZE+1]; //名前 char tel[TEL_SIZE +1]; //電話番号 char address[ADDRESS_SIZE +1]; //住所 struct data *next; //次のデータへのポインタ }data; void file_read(); void file_write(data*, data*); #endif [address.3.c] #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include "address3.h" static char Title[] = "名前,電話番号,住所\n"; static char delm[] = "-------------------------\n"; data* head = NULL; data* tail = NULL; data* p = NULL; void file_read() //ファイル読込 { FILE* fp; char str[300] = { 0 }; char* sp, * ep; int count = 0; printf(delm); printf("ファイルを読み込みます。\n"); fp = fopen("address3.csv", "r"); if (fp == NULL) { printf("ファイルを開けませんでした。\n"); return; } printf(delm); fgets(str, sizeof(str), fp); //Title printf("%s", str); while (1) { p = (data*)malloc(sizeof(data) * 1000); if (p == NULL) { printf("メモリ確保エラー\n"); break; } fgets(str, sizeof(str), fp); //配列strに一行ずつ読み込む if (feof(fp)) break; sp = str; if ((ep = strchr(str, ',')) != NULL) { *ep = '\0'; strcpy(p->name, sp); printf("%s,", p->name); sp = ep + 1; if ((ep = strchr(sp, ',')) != NULL) { *ep = '\0'; strcpy(p->tel, sp); printf("%s,", p->tel); sp = ep + 1; if ((ep = strchr(sp, '\n')) != NULL) { *ep = '\0'; strcpy(p->address, sp); printf("%s \n", p->address); } } } p->next = NULL; if ((head == NULL) && (tail == NULL)) { head = p; tail = p; } else { !!!!!!!!!!!tail->next = p;!!!!!!!!!!!!!!!!!!!!!!!!! tail = p; // } tail->next = NULL; } fclose(fp); free(p); } void file_write(data* head, data* tail)//ファイル保存 { FILE* fp; int peopleCnt = 1, count = 0, count2 = 0; data* temp = { 0 }; data* current; data* index; data* index2=0; printf(delm); printf("ファイルへ保存します。\n"); fp = fopen("address3.csv", "w"); if (fp == NULL) { printf("ファイルを開けませんでした。\n"); return; } puts(delm); puts(Title); fputs(Title, fp); if (head == NULL) { printf("登録がありません。\n"); } //名前の昇順で保存 while(index2==NULL) { index = head; !!!!!!!!!index2 = head->next;!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!if (strcmp(index->name, index2->name) > 0)!!!!!!!!!! { temp = index2; index2= index; index = temp; } printf("%s,%s,%s\n", index->name, index->tel, index->address); fprintf(fp, "%s,%s,%s\n", index->name, index->tel, index->address); } fclose(fp); }

補足情報(FW/ツールのバージョンなど)

visualstudio2019

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

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

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

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

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

guest

回答2

0

ベストアンサー

if ((head == NULL) && (tail == NULL))

が、偽に成る条件は?

投稿2019/11/14 04:32

cateye

総合スコア6851

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

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

cateye

2019/11/14 05:02 編集

main()がないので実行ファイルが作れません・・・は、いいのですがw こちらでは、cc -c で20個ほどワーニングが出ますがそちらではどうでしょう。 y_waiwaiさんの仰るように、問題箇所にブレークポイントを張ってデバッガで見てみましょう。 環境↓ Linux usr.Mint192 5.3.0-23-generic clang version 10.0.0 (trunk 375195)
guest

0

head がNULLなのでそれをどーにかしましょう、とエラーメッセージではおっしゃってます

で、みたところVisualStudioを使ってるものと思われますが、そのエラーの出る行にブレークポイントを設定すれば実行がそこで止まってくれますんで、そこで各変数の中身を見てみましょう。

投稿2019/11/14 04:25

編集2019/11/14 04:27
y_waiwai

総合スコア87749

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問