5

私はCで書かれたある種のファイル共有プログラムに取り組んでいます。データファイルを読み取ってデータを文字列に保存し、この文字列をメイン関数に返し、メイン関数がクライアントに送り返す関数があります。コードを以下に示します

char* ListFiles(){
    FILE *fp;
    char file[30];
    char *f;
    if((fp=fopen("list","r"))==NULL)  
    {
        ...
    }
    while (!feof(fp))
    {
        fgets(file,50,fp);
    }
    fclose(fp);
    f=file;
    printf("%s",f); //get display!!!
    return f;
}
int main(){
      char *files;
      ...
      ...
      files=ListFiles();
      printf("%s",files); //nothing display!!
      sent();
}

ただし、この方法は機能しません。何も表示されず、もちろん何も送信されません。しかし、関数 ListFiles() で正しい表示が得られます。何が起こるかわかりません。strcpy() も使用していますが、まだ機能しません。

4

6 に答える 6

10

George Skoptsov推奨事項に従ってください。strdup()ただし、関数がない場合は、次を使用します。

char* strdup(const char* org)
{
    if(org == NULL) return NULL;

    char* newstr = malloc(strlen(org)+1);
    char* p;

    if(newstr == NULL) return NULL;

    p = newstr;

    while(*org) *p++ = *org++; /* copy the string. */
    return newstr;
}

その後:

#include <string.h> /* strlen() call */
#include <stdlib.h> /* NULL, malloc() and free() call */

/* do something... */

char* ListFiles() {
        /* .... */ 
         return strdup(f);
}

または、代わりに:を実行するchar file[30];と、現在はローカル変数へのポインターではないため、正常に動作します。dynamic memory allocationchar* file = malloc(30);return f;f

于 2012-04-12T21:40:27.320 に答える
8

あなたがしているのは、スタックに割り当てられていたローカル変数へのポインターを返すことです。

returnステートメントを次のように変更します

return strdup(file);
于 2012-04-12T20:43:30.983 に答える
4

fileはスタック変数でListFiles()あり、それへのポインターを返しています。その関数から戻ると、変数は存在しなくなるため、返されたポインターは無効になります。

文字列を返したい場合は、それを heap に割り当て、返し、使用し、使い終わったら解放する必要があります。

于 2012-04-12T20:44:32.913 に答える
2

スタック変数へのポインターポイントを返しています。関数が戻ると、スタックは取り除かれます。スタック変数は存在しなくなり、ポインターはダングリング ポインターになります。

1 つの解決策は、メイン関数に適切な量のメモリを割り当て、メモリへのポインターをヘルパー関数に渡すことです。

于 2012-04-12T20:47:11.537 に答える
0

スタック (関数スタック) に割り当てられている文字列値 char file[30] を表示しようとしています。このメモリの内容は、メソッドが戻った後は保証されません。動的に割り当てるか(mallocなど)、最終的にグローバル値を使用するか、外部関数のスタックに割り当てる必要があります(例のmain()関数)

于 2012-04-12T20:46:23.383 に答える