簡體   English   中英

在C中返回一個char指針

[英]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 allocationchar* file = malloc(30); 然后你可以做return f; 並且它將正常工作,因為f now不是指向局部變量的指針。

fileListFiles()的堆棧變量,並且您將返回指向它的指針。 從該函數返回后,該變量將不再存在,因此返回的指針將無效。

如果你想返回一個字符串,你應該在堆上分配它 ,返回它,使用它,然后在你完成它之后釋放它。

您不應該返回自動存儲中的數據,當您返回它超出范圍時。

您正在嘗試顯示在堆棧(功能堆棧)上分配的字符串值char文件[30]。 方法返回后,無法保證此內存的內容。 你應該動態分配它(例如,malloc)或最終使用全局值,或者在外部函數的堆棧上分配它(在你的示例main()函數中)

您正在返回指向堆棧變量的指針。 當函數返回時,堆棧會彈出。 堆棧變量不再存在,指針變為懸空指針。

一種解決方案是在main函數中分配適當的內存量,並將指針傳遞給內存到輔助函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM