既超級簡單又超級複雜的C語言問題

時間 2021-09-11 22:29:10

1樓:匿名使用者

除程式1外,其餘的本質上講都是有問題的,不管他可不可以通過編譯,可不可以“執行”

程式1沒什麼好解釋的,唯一要注意的是不要輸入超過100個字元

程式2和3,分配的位元組數過小,而程式3之所以看似能“執行”是因為他沒有free函式,但是當輸入的字元比較多時,比如說多於二三十個字元時,你就會顯示的看到,系統報錯

程式4,不用執行,根本就是邏輯上有問題

char s1[2];

strcpy(s1,str);

最基本的strcpy函式的第一個引數,是一個指向足夠大空間的指標,以容納第二個引數指向的內容,這個就根本不滿足

程式5同2,3的道理,把字元數一加多,就會有問題

程式6和4完全是一個東西

總之,lz都是在運用c編譯器不對越界進行檢查的特性亂來而已,本質上都是不可行的,且不具有可移植性,如果採用對越界進行較為嚴格檢查的編譯器,立馬會報錯,比如vs2010

最後給個忠告,不要沒事做這種無意義的實驗

2樓:匿名使用者

對於程式2

malloc分配記憶體的時候,這片記憶體的結尾會有個標記,因為他只分配了一個字元的空間,也就是一個位元組,所以他在輸入一個字元的時候,實際上有兩個字元,還有個回車,回車把這片記憶體的結束標記給佔據了,所以釋放的時候不能判別了,所以就報記憶體錯誤了。如果直接回車就不會有事了。

程式4和程式6不是一樣的嗎,不過我這邊怎麼沒事,沒有錯啊

3樓:匿名使用者

不能執行的都是因為記憶體訪問越界了,使用字元指標操作字串的時候一定要確保你的指標指向的空間足夠放下字串。

4樓:吱___吱

你這程式太多了,容我一個一個看,你的程式六越界了,應該是char s1[20],打錯了吧

5樓:匿名使用者

前幾個程式沒發現什麼問題,不知道你用的是什麼環境,我幫你執行了下,上面所有你說不能執行的程式都是可以被編譯(我用的是dev c++),你可以去試試。。。

你最後一個程式char *str=s這樣賦值是不行的,很容易出錯,你可以改下

#include

#include

#include

int main()

6樓:匿名使用者

樓上的回答都很高深,沒看明白。把我的理解也說下:

c語言中的字串(c++中叫做c風格字串),他的一個最大特點就是以null結尾。所以他的儲存空間比實際字元數多一個。

c風格字串,在c中是標準庫型別,不是c的內建型別。他的記憶體管理由程式負責。

記憶體管理不好會產生溢位。

malloc和free是c語言中用來管理記憶體(或者叫堆)的。

free釋放記憶體空間。如果不釋放會產生記憶體(堆)耗盡。

字元陣列複製給字元陣列,會產生溢位(陣列對儲存空間大小有要求)。

c語言中的字元指標在記憶體中是線性儲存的,他將一塊連續的區域(直到出現null為止)做為一個字串。沒有儲存空間大小的要求。 字元陣列複製給字元指標,或字元指標複製給字元指標。

不會產生溢位。

動態建立的陣列(返回指向新分配陣列第一個元素的指標,可見本質是一個指標。),當釋放時會報錯(釋放時釋放的是空間,當然有儲存空間大小要求)。

4、char s[20]="djksafd";

char *str=s;//對str進行解引用後是陣列s。

5、char s[20]="djksafd";

char *str="hakdshkdsak";//對str解引用後是c風格字串

超級簡單的問題,超級簡單的乙個問題

不奇怪,我朋友還夢見過考試題呢.夢是否有預知未來的能力呢?古往今來大家都對此很好奇.我個人的一點膚淺的看法是,作為時間的決定者 光 來說,它是既有波動性,也有粒子性.如果是波,那就每隔一段時間就會重複.但 光 的波動性比較微弱,所以重複的部分還是會有一點點的偏差.也就是人雖然能發現歷史在不停的 似曾...

求一套超級簡單執行且超級有用的籃球戰術

1 訓練工作中突出練思想,練作風。並強調籃球基本功練習。2 戰術訓練要從難 從嚴,從是實戰出發,特別強調整體配合。3 戰術訓練過程中,要進一步組織陣容,配合全隊力量,要十二個隊員都能上場打球,充分發揮全隊的特長,克服弱點,全隊戰術逐漸形成完整的戰術體系。4 每天的自練時間為一小時投籃練習。5 練 戰...

超級好吃的蛋餃怎麼做好吃又簡單,做法圖

0澤國a網盤 主料雞蛋 4個五花肉 250 輔料生抽 適量料酒 適量生薑粉 適量油 適量雞精 適量鹽 適量蔥 適量胡椒粉 適量香油 適量姜 適量 具體步驟 第一步第一步 1.五花肉洗淨剁碎 第二步第二步 2.蔥洗淨剁碎 第三步第三步 3.肉餡中加入鹽 生抽 香油 生薑粉 胡椒粉和蔥花,一個雞蛋攪拌均...