簡體   English   中英

這個C ++程序會發生什么?

[英]what happens in this C++ program?

考慮以下程序:

#include <iostream>
int main()
{
    int num=345;
    std::cout<<"num " + num<<'\n';
}

當我運行該程序時,它將F顯示為輸出。 怎么樣? 在這里執行指針算術嗎? 如果我使用-符號而不是+,則會出現空白輸出。

字符串文字"num "const char[5] ,它會衰減為要添加偏移量的const char*

以下代碼等效於您的工作:

#include <iostream>
int main()
{
    int num = 345;
    const char* c_str = "num ";
    std::cout << c_str + num << '\n';
}

答:您有未定義的行為,因為您正在訪問數組范圍之外的內存位置。 您違反了內存安全性。

由於cout僅在找到c字符串的'\\0 '后才停止打印,因此您可以繼續打印直到找到為止。 您不知道該值何時會下次發生,因此您具有A中說明的不確定行為。

假設您有"num"字符串。 在內存中看起來像

 0  1  2  3  4
[n][u][m][ ][\0]

打印時,它將用作指針。 現在,您向其添加了345的偏移量。

 0  1  2  3  4   5  6  7     345
[n][u][m][ ][\0][?][?][?]....[F][?][?]

您的程序可能打印的不僅是F,它會在找到的第一個\\0停止。 這是未定義的行為,因為您的程序幾乎可以打印任何內容,並將訪問無效的內存地址。

如果您的目標是打印整數,則可以編寫

std::cout << "num" << num << std::endl;

編譯所有警告非常有啟發性:

g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp: In function 'int main()':
main.cpp:6:25: warning: array subscript is above array bounds [-Warray-bounds]
     std::cout<<"num " + num<<'\n';

                         ^

這里

本質上,編譯器告訴您,您已經在存儲"num "的基礎數組上完成了指針運算。 本質上, "num "是一個數組,用於存儲該字符串文字所需的字符。 對它執行算術運算時,它會衰減為const char* ,然后將345添加到指針地址。 該內存地址在定義的數組之外,在您的特定計算機上,它恰好是值F 但是,這是未定義的行為,輸出可能完全是其他計算機上的其他內容。

這些編譯器警告通常是錯誤的結果,因此,注意編譯器告訴您的內容通常非常有價值。

暫無
暫無

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

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