1

このコードを使用すると

char *openFile(const char file[1024]){
FILE *f = fopen(file, "r");
char c[1000];
char *d;
if (f!=NULL) {
    if (fgets(c, 1000, f) !=NULL){
        d = c;
    }
    else{
        d = "No text";
    }
}
else{
    d="error";
    printf("%s", d);
}
fclose(f);

return d;
}

たとえば、この長いテキストを取得するには

fosndjfnsondfnsnkdfsjndfoweoingfoweljksdnflwkengdfwoensldkfwejlnfkdlskdfnlskdnflskdnflksndlfknslkdnflkndlknfslnlfjnlksdnjfnjwnejnfwenfnjwenlfodnakdoifnkleroglknerolkdfgnrkldsfgnlskdfgnlksdfglndlfkngkldnslkgnlkfdnkglnklsndfklnglfdlskgknllkdglksdfkkngkresoirigknlsdf

(このテキストは何の意味もありません。単なるテストです)そして、char *d;それが出力するこれを返します

fosndjfnsondfnsnkdfsjndfoweoingfoweljksdnflwkengdfwoensldkfwejlnfkdlskdfnlskdnflskdnflksndlfknslkdnflkndlknfslnlfjnlksdnjfnjwnejnfwenfnjwenlfodnakdoifnkleroglknerolkdfgnrkldsfgnlskdfgnlksdfglndlfkngkldnslkgnlkfdnkglnklsndfklnglfdlskgknllkdglksdfkkngkresoir¯ˇˇˇˇˇˇˇv”[

最後に変なキャラが出てくるのはなぜ?

4

1 に答える 1

3

cでローカル変数として定義しましたopenFile。読み取りが成功すると仮定すると、そのアドレスが に返されdます。の最後で破棄されるopenFileためd、ダングリング ポインターになります。返された後に使用しようとするとopenFile、未定義の動作が発生します。

可能な解決策には、 として定義cstatic、代わりに で割り当てられたバッファを返すことが含まれmallocます。casの定義にstaticはかなりの数の落とし穴があり、特にマルチスレッドが関係する場合はそうであるため、動的割り当ては多くの場合かなりクリーンです。

于 2013-03-09T16:07:58.387 に答える