亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于linux下c語言數組的問題

關于linux下c語言數組的問題

C
kkkbbb 2016-02-16 20:50:55
#include<stdio.h> #include<string.h> main(){ char?num[3]; int?size; gets(num); size=strlen(num); printf("%d",size); } 這個程序我定義的num的大小是3,為什么運行時不管我輸入多少個字符都可以正常打印,,用gdb調試還可以打印出num[4],num[5],num[6]……的值,?那定義數組的大小還有意義嗎???這樣寫或造成什么,,
查看完整描述

2 回答

?
onemoo

TA貢獻883條經驗 獲得超454個贊

定義數組時必須指定大小(忽略變長數組),這樣編譯器可以保證給這個數組留出足夠大的空間,這點也是“定義數組大小的意義”(況且這也是C標準所規定的)

然而C對內存的操作是很靈活的,即便你的數組大小只有3,你確實是可以通過num[4]之類的操作繼續訪問后面內存中的內容,這就是“訪問越界”。 因為編譯器在編譯時不會對此進行檢查,所以這樣的代碼是可以編譯通過的,但這不意味著這代碼一定可以運行!?

在你的例子中,你越界輸入的字符存儲在數組后面的內存中,有可能會覆蓋掉后面的其他變量,也有可能寫入了只讀內存區... 這些都會引起運行時錯誤,輕則會引起難以察覺的小bug,重則引起程序崩潰。

你可能聽說過各種緩沖區溢出漏洞,它們大多是由越界訪問引起的,所以這樣的代碼有嚴重的安全隱患,在實踐中一定要避免犯這樣的錯誤!


也正如 @AHe 說的,C字符串以'\0'為結尾,strlen這種字符串函數大多是以'\0'為判斷依據的,所以可能會讀出正確的size。 當然這個代碼的問題并不在此,根本問題還是很出在數組越界上。


另外,你定義main函數時缺少返回值,且最好按照標準寫法 int main(void) {...}

P.S. Linus不會提這樣的問題吧...哈哈

查看完整回答
1 反對 回復 2016-02-18
  • 2 回答
  • 0 關注
  • 2055 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號