❶ c語言為什麼有函數危險一說啊 比如gets()的溢出操作等;
是的,如果這是某書上的做法,那麼,我只能說它為你們提供了一個錯誤的榜樣。
這樣使用gets()已經發生了溢出!這是gets()不檢查數據邊界的bug造成的。
另外,「字元串不是總是以'\0'作為串的結束符」,答案是肯定的,不然puts()函數就不能在合適的地方停下來了。這里st[15]被gets()函數賦值為'\0'。這里要說明的是st[15],st[16]是存在而不合法的,因為字元串實際上就等同於指針,類似st[16]是實在的地址但是是不應該被引用的。
為什麼這里溢出沒有產生錯誤?可能系統分配內存是以一個最小的大小整段整段的分配(這個我只是猜測)。你可以試著輸入的字元串變長一點,就可以看到內存讀寫出錯的提示了,這就是溢出的嚴重後果!我在dos系統下測試字元串長了直接當機。
驗證1:st[15]被賦值為'\0'
#include"stdio.h"
main()
{
charst[15];
printf("inputstring:");
gets(st);
puts(st);
printf("%d",st[15]);
getch();
}
驗證2:
#include"stdio.h"
main()
{
charst[15];
printf("inputstring:");
gets(st);
puts(st);
//printf("%d",st[16]);
st[1]='\0';
printf("%s\n",st);
printf("%s",st+2);
getch();
}
同樣的建議:拒絕gets(),這本來就是一個有bug的函數!
❷ c語言不安全為什麼還很有多人用
因為C語言比其他語言編譯出的軟體運行快啊 所以C語言一般放到嵌入式開發
打個比方
你哪天電視遙控器壞了,你要買個新的
1種遙控器晶元是最新電腦用的晶元,用的遙控器用的軟體用哪個語言開發都會很快 那這個遙控器價格 呵呵..
另1種遙控器價格就十幾塊錢 你想它的晶元運算速度能多快... 那假如裡面是其他語言 估計你按完開機後10秒(極端例子)後才能響應開機,但用C語言 能馬上開機。
安全問題,不就是多個指針跑飛和內存泄漏么,這個真沒法避免
但使用指針和內存分配的確能使C語言運行靈活
再說了 其他語言該出Bug也不照樣出Bug么