簡體   English   中英

output 運算符如何知道字符數組的大小?

[英]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應用於任何其他數組時,編譯器無法確定數組的大小,因此只能給出指向數組的指針的大小。

請參閱: 如何找到“sizeof”(指向數組的指針)?

實際上,它只是未定義的行為,str 旁邊的 memory 具有 null 終止,因此在某些情況下 print() function 可以打印垃圾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM