1

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
4

0 に答える 0