看到這樣乙個改錯題:
charp[5
]; char*s
="12345";
strcpy(p,s);
cout << p << endl;
錯誤之處是很顯然的,作為字串字面值的"12345"會在結尾處自動加上空字元null,從而長度是6,上面的strcpy是會越界的,從而是個越界錯誤。
問題是我以為這樣的程式編譯的時候會出錯呢!但是我在vc上執行時是可以輸出正確結果的,這讓我很是納悶!後來找到了strcpy的源**才知原因,strcpy函式是不進行越界處理的. 又因為strcpy連null一起複製,從而p能輸出正確的結果"12345"
char
*__cdecl strcpy(
char
*dst,
const
char
*src)
charp[5
];char*s
="12345678";
strcpy(p,s);
cout
<<
p <<
endl;
//輸出12345678,而不是我們所設想的12345
charp[5
];char*s
="12345";
strncpy(p,s,5);
cout
<<
p <<
endl;
//12345*&^(後面表示亂碼)
不是都限制個數了麼?為什麼後面又有亂碼?
問題來自在上述情形strncpy是不會複製字串s後面的null的,不是以null結束的p不會輸出正確結果的。
仍然給出strncpy的源**:
char
*__cdecl strncpy (
char
*dest,
const
char
*source, size_t count )
那strncpy這麼不穩定,為何用它?strncpy經常用於修改乙個長字串中間的一部分(看出不複製null的原因了吧!),如果實在要用到上述的**上,就在**最後加上p[5] = '/0'; 吧!
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...