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 allocation:char* file = malloc(30);然后你可以做return f;,它会正常工作,因为fnow 不是指向局部变量的指针。

于 2012-04-12T21:40:27.320 回答
8

您正在做的是返回一个指向局部变量的指针,该变量过去是在堆栈上分配的。

将您的退货声明更改为

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

file是一个堆栈变量ListFiles(),你正在返回一个指向它的指针。从该函数返回后,该变量将不复存在,因此返回的指针将无效。

如果你想返回一个字符串,你应该在堆上分配它,返回它,使用它,然后在你完成使用它后释放它。

于 2012-04-12T20:44:32.913 回答
2

您正在返回一个指向堆栈变量的指针。当函数返回时,堆栈被弹出。堆栈变量不再存在,指针变成悬空指针。

一种解决方案是在主函数中分配适当数量的内存,并将指向内存的指针传递给辅助函数。

于 2012-04-12T20:47:11.537 回答
0

当您返回超出范围时,您不应该返回位于自动存储上的数据。

于 2012-04-12T20:45:00.727 回答
0

您正在尝试显示在堆栈(函数堆栈)上分配的字符串值 char 文件 [30]。方法返回后,不保证这块内存的内容。您应该动态分配它(例如 malloc)或最终使用全局值,或者在外部函数的堆栈上分配它(在您的示例 main() 函数中)

于 2012-04-12T20:46:23.383 回答