Study Area Facebook粉絲團http://www.facebook.com/sataiwan
0 會員 與 1 訪客 正在閱讀本文。
請問各位一下scanf 用的 buffer 我設為 char buf[5] 大小應該只能放四個字元跟\0 ,為什麼我鍵盤輸入像是 123 456 789 他還是可以執行而不會發生錯誤謝謝#include <stdio.h>#include <stdlib.h>void read_str();int main(){ read_str(); system("pause"); return 0;}void read_str(){ char buf[5] = {}; scanf("%[^\n]",buf); printf("%d\n",strlen(buf)); printf("%s\n",buf);}
$ ./scanf12345677, 1234567$ ./scanf1234567899, 123456789*** stack smashing detected ***: ./scanf terminated======= Backtrace: =========/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7f5cedeca817]/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x0)[0x7f5cedeca7e0]./scanf[0x4007ed]./scanf[0x400659]/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f5cedde176d]./scanf[0x400691]======= Memory map: ========00400000-00401000 r-xp 00000000 00:16 1032 scanf...........7fffbf310000-7fffbf311000 r-xp 00000000 00:00 0 [vdso]ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]Aborted$
因為 c/c++ 的標準裡頭不會檢查 buffer 長度.以低階系統處理的角度來看, 這是優點. 以高階程式語言來看, 這算是缺點.
以近代的作業系統來說, 用到的機會不大.以前的很多環境 (其實現在應該也都還有, 只是不是一般人用的), 有些功能可以直接修改某些固定位址的資料來達成.用 C 可以很簡單的就處理 (指標指過去後, 不會管你那個空間有多大, 可以直接改).如果用不到, 當成缺點也可以.