[英]How does the output operator know the size of an array of chars?
C++ Primer 一書規定如下:
因為 arrays 作為指針傳遞,所以函數通常不知道給定數組的大小。 他們必須依賴呼叫者提供的其他信息。
所描述的選項包括使用結束標記字符、使用指向 position 的指針傳遞數組的最后一個元素,或使用參數來表示數組的大小。
但是,當我創建一個非空終止的const char
數組並將其傳遞給名為print
的 function 時, <<
運算符完全知道在沒有任何這些技術的情況下何時停止讀取。 它是怎么知道的?
#include <iostream>
void print(const char line[]) {
std::cout << line << '\n';
return;
}
int main() {
const char str[] {'f', 'o', 'o', ' ', 'b', 'a', 'r'};
print(str);
return 0;
}
您剛剛幸運地使用了 memory 布局,並且意外出現了空終止符。
在 VS2019 上,我得到一個 output :
foo bar╠╠╠╠╠CÌ╦À<³3☺33Ò
嘗試彈出:
std::cout << sizeof(line) << '\n';
和
std::cout << sizeof(str) << '\n';
你會看到指針大小和數組大小之間的差異。
進一步說明:
當sizeof
應用於其定義對編譯器可見的數組時,它返回分配給該數組的字節數。
當sizeof
應用於任何其他數組時,編譯器無法確定數組的大小,因此只能給出指向數組的指針的大小。
實際上,它只是未定義的行為,str 旁邊的 memory 具有 null 終止,因此在某些情況下 print() function 可以打印垃圾
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.