前提・実現したいこと
C++にて、新たな会員をリスト末尾に追加するプログラムを書いています。
提示されたプログラムの穴埋めをする方式で書いているので自分で変更できる箇所は限られています。(コード内で穴埋め箇所をコメントしました)
コンパイル時にエラーは見つかりませんでしたが、以下の警告が出ました。また、実行するとmain関数while文でエラーが出てプログラムが停止します(関数createMember、関数addを除いたwhile文だと実行できたため、警告が出た関数createMemberに問題があると考えています)。
発生している問題・エラーメッセージ
NULLポインター"m"を逆参照しています。 m->nameは0である可能性があります。この動作は、関数'strcpy'の指定に従っていません。
該当のソースコード
C++
1#define _CRT_SECURE_NO_WARNINGS /*自分のパソコンの環境上必要なため*/ 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5 6typedef struct MEMBER { 7 char* name; 8 int point; 9 struct MEMBER* next; /*構造体のメンバはすべて穴埋め。名前、ポイント、次の要素へのポインタが必要*/ 10} Member; 11 12Member* top; 13 14Member* createMember(char* name, int pt) 15{ 16 Member* m = (Member*)malloc(sizeof(Member)); /*sizeof(Member)が穴埋め*/ 17 m->name = (char*)malloc(sizeof(char) + 1); /*sizeof(char)が穴埋め。この行でエラー「NULLポインタ~」が発生*/ 18 strcpy(m->name, name); /*この行でエラー「m->nameは~」が発生*/ 19 m->point = pt; 20 m->next = NULL; 21 return m; 22} 23 24void FreeMember(Member* m) 25{ 26 free(m->name); 27 free(m); 28} 29 30void add(Member* m) 31{ 32 if (top == NULL) 33 top = m; 34 else 35 { 36 Member* cur = top; 37 while (cur->next != NULL) 38 { 39 cur = cur->next; 40 } 41 cur->next = m; /*else文内は全て穴埋め。最後尾に新たな会員mを追加する*/ 42 } 43} 44 45void printList(void) 46{ 47 Member* p = top; 48 for (int i = 1;p;p = p->next, i++) 49 { 50 printf("%d:%s[%d]", i, p->name, p->point); 51 if (p->next) 52 printf(" -> "); 53 } 54 printf("\n"); 55} 56 57int main(void) 58{ 59 FILE* fp = fopen("members.txt", "r"); /*memberx.txtはプログラムと同じソースファイル内に存在し、名前とポイント数が記載されています*/ 60 char buf[100]; 61 while(fgets(buf,100,fp)) 62 { 63 char* name = strtok(buf, "\t\n"); 64 int pt = atoi(strtok(NULL, "\t\n")); 65 Member* m = createMember(name, pt); /*(name,pt)が穴埋め*/ 66 add(m); /*mが穴埋め*/ 67 } 68 fclose(fp); 69 printList(); 70} 71/*以下、members.txtのコピペ 72Watson 1850 73Greg 1320 74Fald 990 75Tiger 2500 76George 3350 77Nick 1080 78Daily 704 79Aoki 834 80Jambo 910 81Kuramoto 520 82*/ 83
試したこと
sizeof(Member)をsizeof(Member)*10へ変更
関数createMembr、addをmain関数から消しての動作確認
補足情報(FW/ツールのバージョンなど)
Visual studio2019 (質問前日に最新版へ更新済み、更新後も同様のエラーの発生を確認)
回答3件
あなたの回答
tips
プレビュー