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

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

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.煮至魚熟時撈出魚塊,仔細地剔去魚骨!一定要認真挑去骨頭,小...

要小發明超級超級簡單的急急急急急急急急!!要交的

教你只做四個東西 1.屏風 美術加手工 剪刀,彩筆,竹子 竹條即可 透明膠帶,美工刀,鉛筆等 a 將竹子削剪成兩根牙籤粗細的竹條,然後沒8cm截斷一下,共要5根,當然要想屏風大可將竹條的長度,數量加多。b 尋找有風景畫的掛曆等彩色卡紙,當然也可以自己繪畫。裁剪成7cm長3cm寬的長方形紙條 畫條 共...

cf超級跳祕訣,要簡單,易學的謝謝

lz,不知道我教的好不好 我不想他們那麼的難。首先按住ws 不要放開 之後一直跳 三下保證上的去 1.將跳鍵由空格鍵設定成 滑鼠滾輪下滑 滑鼠滾輪每撥動一格就是一次起跳命令 每次撥動至少會有5到6格 對你練習第二步抓住落地瞬間起跳非常重要 2.練習連跳 一直按住方向 前 撥動滾輪跳起 在落地瞬間再次...