慕粉18341035298
2017-01-10 17:25:10
#include<cstdio>
#include<stdlib.h>
#include<iostream>
int?main()
{
?char?s[]?=?"asdfasdf";
?FILE?*d?=?fopen("a.txt",?"r");
?if?(d?==?NULL){
??printf("no\n");
??exit(0);
?}
?char?*m;//改成m[10]才可以,原來的寫法為什么不對?
?fgets(m,5,?d);
?printf("%s\n",?m);
?fclose(d);
}
3 回答
已采納

onemoo
TA貢獻883條經(jīng)驗 獲得超454個贊
fgets 函數(shù)會把讀到的字符串存入第一個參數(shù)所指的內(nèi)存中。然而 char?*m ?這個 m 只是個 char 指針,且 m 沒有被賦予初值,那么 m 的初值是不確定的——也就是說 m 指向一塊不確定的內(nèi)存,那一般不是你能合法、安全使用的內(nèi)存。
fgets 的參數(shù)是指針,但它要操作的是指針所指的內(nèi)存,所以注意不要僅僅傳入一個指針,而是要確保指針所指的內(nèi)存是你能合法使用的。
將 m 聲明為 char m[10],這樣 m 就是一個能容納10個字符的數(shù)組。數(shù)組名在作右值使用時(傳參時)會自動轉(zhuǎn)為指向數(shù)組首元素的指針,所以你傳入 fgets 的 m 就是一個指向 m 數(shù)組的指針。這樣就可以讓 fgets 正常工作了。

Xyino_Snake
TA貢獻31條經(jīng)驗 獲得超22個贊
這是一個中規(guī)中矩的C語言問題。我知道這是C++。char * 只是一個指針。你并不能直接往這個指針里寫內(nèi)容。除非它指向一塊已經(jīng)分配好的內(nèi)存。比方說指向一個全局的char數(shù)組緩沖區(qū)。或者,你也可以用new來動態(tài)分配一塊內(nèi)存??梢詫懗蒫har * m = new char[256];然后再傳m給fgets就行了。當然,new []分配的內(nèi)存必須用delete []手動釋放掉。

- 3 回答
- 1 關注
- 1610 瀏覽
添加回答
舉報
0/150
提交
取消