簡體   English   中英

將字符串傳遞給C中的函數

[英]Pass a string to a function in C

我有以下代碼:

#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;
}

我得到以下輸出:

#��x�

不是很好。 我的意圖是打印出名稱為“ suma.c”的文件的第一行。 它應該打印出以下內容:

#include <stdio.h>

不過,如果我將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;
}

我現在得到的輸出是正確的:

#include <stdio.h>

我的理由是這樣的:通過使用fgets我省“name.c”的第一行的字符串p數組和我返回它的地址,這是采取的第二個參數printf函數main
但是我發現這僅在我直接將printf函數用於同一個lookLine函數lookLine有效...

拜托,有人可以告訴我這里的實際情況嗎?

這是因為您要從read函數返回一個指向本地數組的指針。

請記住,局部變量存儲在堆棧中,其中包括數組。 當函數返回時,編譯器將回收堆棧空間,以供其他函數調用使用。 因此,您有一個指向另一個函數的內存的指針。

數組p的生存期在return語句處終止(從技術上講, p是具有自動存儲持續時間的局部變量;這意味着其生存期在匹配的}處結束)。

該程序然后調用未定義的行為,因為它使用了不確定的值(從不再指向有效內存的指針讀取)。 這就是為什么您可以在仍處於read()打印字符串,但從main()打印時卻得到垃圾的原因。

並請注意, read是一種POSIX函數,可能會干擾您定義的函數(在嚴格的C89或C99模式下不是問題,但默認情況下大多數編譯器都不是)。 [與此同時,OP將函數重命名為lookLine() 。]

正如Joachin Pileborg正確指出的那樣,您試圖返回一個從函數返回時將被回收的堆棧變量。

相反,您可以嘗試將字符數組及其大小作為傳遞給函數read的輸入。 順便說一句,如果除了在read函數中調用fgets之外,您不打算做其他事情,那么最好在main函數本身中調用fgets。

如果您要在讀取中執行一些其他邏輯,並且您也無法通過緩沖區並將緩沖區的大小作為讀取函數的輸入,則可以使用malloc分配讀取所需的內存,並將指針返回到調用函數。 但是,就個人而言,我不建議這樣做,因為最好確保read的調用者承擔創建和刪除數組的責任。

暫無
暫無

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

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