[英]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.