[英]fgets error and strings declaration style on c
我對一件事感到好奇,以下代碼可以完美運行。
#include <stdio.h>
int main()
{
FILE * fp = fopen("test.txt", "r");
char line[100];
while( fgets(line, sizeof(line), fp) != NULL )
fputs(line, stdout);
fclose(fp);
return 0;
}
但是為什么不能使用它呢:
char *line;
不會導致fget崩潰?
有可能的。 只需將其指向一些有效的內存即可。
char line[100];
char* linep = line ;
while( fgets(linep, sizeof(line), fp) != NULL )...
如果您不將行分配給linep,則linep指向隨機內存,您將無法使用它。
fgets
崩潰是因為它將結果寫入未分配的內存中 。
沒有任何進一步的內存分配, char *line
指向“ nothing”。 它指向某個內容 ,但不指向任何有效的內存位置-如果編譯器將未初始化的值設置為0
,則指向null
,或者指向系統上任何位置或不在系統上的任何隨機內存位置。
即使fgets
不會崩潰,你無法預測它做什么的寫入未定義的行為未分配的內存結果( 什么是未定義行為? )。
char *line
和char line[100]
含義不同。 第一個是指向char
的指針,我們不知道它是單個char還是指向的char數組。 另一方面,第二個是數組。
fgets
需要一個有效的位置來寫入。 在這種情況下, char *line
沒有指向的有效位置,而char line[100]
是有效的char數組位置
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.