慕粉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]才可以,原來的寫法為什么不對(duì)?
?fgets(m,5,?d);
?printf("%s\n",?m);
?fclose(d);
}
3 回答
已采納

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

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

- 3 回答
- 1 關(guān)注
- 1629 瀏覽
添加回答
舉報(bào)
0/150
提交
取消