0

次のコードがあります。

#include <stdio.h>

char * lookLine (FILE *fichero) 
{
    char p[25];
    fgets (p, sizeof (p), fichero);
    return p;
}

int main (void) {
    printf ("%s\n", lookLine (fopen ("suma.c", "r")));
    return 0;
}

そして、次の出力が得られます。

#��x�

よくない。私の意図は、「suma.c」という名前のファイルの最初の行を出力することです。次のように出力されます。

#include <stdio.h>

それにもかかわらず、文字列の内容をp同じlookFile関数に出力すると、問題なく実行されます。

#include <stdio.h>

void lookLine (FILE * fichero) 
{
    char p[25];
    fgets (p, sizeof (p), fichero);
    printf ("%s\n", p);
}

int main (void) {
    lookLine (fopen ("suma.c", "r"));
    return 0;
}

そして、私が今得た出力は正しいものです:

#include <stdio.h>

私の推論は次のとおりです: を使用してfgets、「name.c」の最初の行の文字列をp配列に保存し、そのアドレスを返します。これは、printf関数 inの 2 番目の引数によって取得されmainます。しかし、これは関数を同じ関数に直接
使用した場合にのみ機能することがわかりました...printflookLine

ここで実際に何が起こっているのか誰か教えてください。

4

3 に答える 3

6

readこれは、関数からローカル配列へのポインターを返しているためです。

ローカル変数はスタックに格納され、それには配列が含まれることに注意してください。関数がそのスタック領域を返すと、他の関数呼び出しで使用するためにコンパイラによって再利用されます。したがって、別の関数のメモリを指すポインターがあります。

于 2013-05-25T15:52:21.130 に答える