将字符串传递给C中的函数

Dan*_*dam 0 c arrays string fgets memory-address

我有以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

#??x?
Run Code Online (Sandbox Code Playgroud)

不太好.我打算打印出名为"suma.c"的文件的第一行.它应该打印出以下内容:

#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)

不过,如果我将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;
}
Run Code Online (Sandbox Code Playgroud)

我现在得到的输出是正确的:

#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)

我的理由是:通过使用fgets我保存p数组中第一行"name.c"的字符串,然后返回其地址,该地址由printf函数in 的第二个参数获取main.
但我发现只有当我将printf函数直接用于同一个lookLine函数时,这才有效...

拜托,有人能告诉我这里到底发生了什么吗?

Som*_*ude 6

这是因为你从read函数返回一个指向本地数组的指针.

请记住,局部变量存储在堆栈中,包括数组.当函数返回时,编译器将回收堆栈空间以供其他函数调用使用.所以你有一个指针指向另一个函数的内存.