2015-03-30 89 views
1

fgets(s, 10, fp)中,s是從文件「text.txt」開始讀取的地址。我對麼?fgets函數的第一個參數

如果是這樣,函數如何知道s在何處被聲明時指向?我一直認爲s會是一個隨機的內存位置? 有人可以更深入地解釋爲什麼這段代碼是從「text.txt」開頭讀取的?

我是新來的C.

fp = fopen("text.txt", "r"); 
    if (fp != NULL) 
    { 
     char *s 
     printf("content of file:\n"); 
     while ((s = fgets(s, 10, fp) 
     { 
      printf("%s", s); 
     } 
     fclose(fp); 
    } 
+1

'我是正確'無,第一個參數是指針陣列,其中讀取的符號將被存儲,該數組應該分配已經 – 2015-03-30 21:26:05

回答

2

s是存儲獲得從文件中讀取的字節數的位置。 (它不是「在文件中開始閱讀的位置」,它是「在讀取它們後將字節放在哪裏」)

在這種情況下,您不需要將s設置爲任何內容,因此您不知道什麼它包含。 (換句話說,它是未初始化的)

所以你告訴fgets存儲它在某個位置讀取的字節,並且你不知道該位置是什麼。也許這是一個未分配的地址(這會導致段錯誤),也許它是一些沒有任何東西正在使用的內存(在這種情況下它可以工作),或者它指向一些重要的東西,你剛剛告訴fgets覆蓋(在這種情況下,工程,然後當其他代碼試圖訪問重要的東西時崩潰)。沒有辦法知道。

+0

感謝您的快速回答,我的教授告訴我們錯誤的第一個論點似乎。 – 2015-03-30 21:36:53

4

您必須將有效指針作爲第一次嘗試傳遞給fgets,並且它必須指向至少與第二個參數中指示的一樣大的內存。

你可以改變

char *s 

char *s = malloc(10); 

char s[10]; 

背後fgets的代碼將文件數據複製到您已分配的內存。

3

您的確在將文本讀入內存中的隨機位置。這可能會崩潰,或成功,或完全做其他事情。一旦你寫入不屬於你的記憶,所有的注單都關閉。

要麼聲明s這樣的:

char s[10]; 

或分配它:

s = malloc(10); 
+0

「將文字讀入隨機位置」?我喜歡其餘的...... – Sebivor 2015-03-30 21:33:10

相關問題