[英]Returning a char pointer in C
我正在開發一種用C語言編寫的文件共享程序。有一個函數可以讀取數據文件並將數據存儲到字符串中,並將該字符串返回給main函數,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(),它仍然無法正常工作。
你正在做的是返回一個指向局部變量的指針,該局部變量曾經在堆棧上分配。
將您的退貨單更改為
return strdup(file);
按照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
now不是指向局部變量的指針。
file
是ListFiles()
的堆棧變量,並且您將返回指向它的指針。 從該函數返回后,該變量將不再存在,因此返回的指針將無效。
如果你想返回一個字符串,你應該在堆上分配它 ,返回它,使用它,然后在你完成它之后釋放它。
您不應該返回自動存儲中的數據,當您返回它超出范圍時。
您正在嘗試顯示在堆棧(功能堆棧)上分配的字符串值char文件[30]。 方法返回后,無法保證此內存的內容。 你應該動態分配它(例如,malloc)或最終使用全局值,或者在外部函數的堆棧上分配它(在你的示例main()函數中)
您正在返回指向堆棧變量的指針。 當函數返回時,堆棧會彈出。 堆棧變量不再存在,指針變為懸空指針。
一種解決方案是在main函數中分配適當的內存量,並將指針傳遞給內存到輔助函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.