我正在开发一种用C语言编写的文件共享程序。有一个函数可以读取数据文件并将数据存储到字符串中并将此字符串返回给main函数,主函数发送回客户。代码如下所示
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(),它仍然无法正常工作。
答案 0 :(得分:8)
你正在做的是返回一个指向本地变量的指针,该变量曾经在堆栈上分配。
将您的退货单更改为
return strdup(file);
答案 1 :(得分:7)
遵循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;
并且它会正常工作,因为f
现在不是指针一个局部变量。
答案 2 :(得分:4)
file
是ListFiles()
中的堆栈变量,您将返回指向它的指针。从该函数返回后,该变量将不复存在,因此返回的指针将无效。
如果你想要返回一个字符串,你应该allocate it on the heap,返回它,使用它,然后在你使用它之后释放它。
答案 3 :(得分:0)
当你返回的数据超出范围时,你不应该返回自动存储的数据。
答案 4 :(得分:0)
您正在尝试显示在堆栈(功能堆栈)上分配的字符串值char文件[30]。方法返回后,无法保证此内存的内容。你应该动态分配它(例如malloc)或最终使用全局值,或者在外部函数的堆栈上分配它(在你的示例main()函数中)
答案 5 :(得分:0)
您正在返回指向堆栈变量的指针。当函数返回时,堆栈会弹出。堆栈变量不再存在,指针变为悬空指针。
一种解决方案是在main函数中分配适当的内存量,并将指针传递给内存到辅助函数。