1

関数から文字列リテラルまたは配列を返したい場合は、呼び出された関数が返されたときに内容が「死ぬ」ことがないように、それを静的として宣言する必要があることを理解しています。

しかし、私の質問は、関数内で malloc を使用してメモリを割り当てる場合はどうですか?

次の関数では:

char * getLine() {

    char *line = (char *) malloc(10 * sizeof(char));

    printf("Enter a string: ");
    fgets(line, 10, stdin);

    return line;
}

この関数から返されたメモリ アドレスは、関数 getLine が返された後でも安全ですか?

4

3 に答える 3

4

関数から文字列リテラルまたは配列を返したい場合は、次のように宣言する必要があることを理解していますstatic

それは正確には正しくありません: それを宣言するstaticと問題は解決しますが、それを動的メモリに割り当てると、つまりmalloc/ calloc/ realloc/ strdup/etc になります。したがって、答えは「はい、malloc関数からメモリを返すことは完全に安全です」です。もちろん、動的メモリを受け取る呼び出し元freeは、不要になったときにそれを処理する必要があります。

EDIT : (コメントに応じて) 実際、staticバッファが共有されたままになるため、一部のコンテキストでは使用が劣る場合があります。たとえば、ユーザーが入力した文字列のリストを作成することにした場合、呼び出し元でコピーを作成する必要があります。さらに、を使用staticすると、関数が再入不可になり、並行環境では有害です。

于 2013-07-14T12:51:17.837 に答える
1

はい、しかし、同じポインターで何か他のものを呼び出す必要があります。そうfreeしないと、プロセスが終了するまでメモリが割り当てられたままになります。

于 2013-07-14T12:51:09.600 に答える