#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不會提這樣的問題吧...哈哈
- 2 回答
- 0 關注
- 2055 瀏覽
添加回答
舉報
0/150
提交
取消