WinXp の MINGW32 でプログラムを実行しました。プログラムは gcc によってコンパイルされ、gdb デバッグ ツールで期待される結果が得られます。しかし、MINGW32 で直接実行すると、WinXp は次のエラーを報告します。
「0x7c956a6e」命令は「0x00000000」のメモリを参照しています。このメモリは「読み取る」ことができません。
次に、この指示を見つける方法は?確認したところ、malloc 関数が原因のようです。ソースコードは以下の通りです:</p>
int find(FILE *fp, char **head) {
char str[100];
char *p, c;
int i = 0, j = 0;
do {
c = fgetc(fp);
if(c == EOF)
return 0;
} while(c == ' ' || c == '\n');
while(c != ' ' && c != '\n') {
str[i++] = c;
c = fgetc(fp);
}
*head = (char *)malloc(sizeof(char) * i);
if(*head == NULL)
printf("\nCannot get memory (find)");
else {
p = *head;
for(j = 0; j < i; j++) {
*(p++) = str[j];
}
*p = '\0';
return 1;
}
return 0;
}
誰でも助けていただければ幸いです!
10/7 コメントありがとうございます。残りのコードとデータ パターンは次のとおりです。
int main()
{
FILE *fp;
int lines = 0, i = 0;
TianYa *yp, *linep;
char *head = NULL;
fp = fopen("tysample.txt", "r");
if(fp == NULL)
printf("\nCannot open file");
else {
yp = (TianYa *)malloc(TIAN_YA_LINES * sizeof(TianYa));
if(yp == NULL)
printf("\nCannot get memory (main)");
else {
linep = yp;
i = 0;
while(find(fp, &head) != 0) {
switch(i++) {
case 0:
linep->name = head;
break;
case 1:
linep->passwd = head;
break;
case 2:
linep->email = head;
i = 0;
linep++;
lines++;
break;
}
}
}
}
linep = yp;
for(i = 0; i < lines; i++) {
printf("\nName:%s, Passwd:%s, Email:%s", linep->name, linep->passwd, linep->email);
/* free(linep->name);
free(linep->passwd);
free(linep->email);
*/ linep++;
}
free(yp);
yp = NULL;
linep = NULL;
if(fclose(fp))
printf("\nFailed to close file");
return 0;
}
momre 123456 baitianyang@live.cn
白天也懂 123456 baitianyedong@tianya.cn
baitiansosuo weirenminfuwu baitianyouxiang@sohu.com
heng__chang 87732351 baitianyu.06@163.com
风正 5581100 baitianyu@126.com
sparkbai 20001228 baitianyu@tianya.cn
背粪篓进银行 19851019 baitianyu123@163.com
白天月 11200929 baitianyue@126.com