簡體   English   中英

C++ 未定義行為

[英]C++ undefined behavior

unsigned char * numbers = {1,1,1};
unsigned short * ptr = (unsigned short*) numbers;
*(++ptr)=2;

printf("%d %d %d %d", numbers[0], numbers[1], numbers[2], numbers[3]);

以上可能會導致未定義的行為,對嗎? 另外,屏幕上會打印什么?

結果是1 1 2 0 ,但可以在某個時候打印1 1 0 2嗎?

這將導致未定義的行為。 首先,因為你讓一個 char 指針指向一個整數數組:注意unsigned char * numbers = {1,1,1};之間的區別unsigned char * numbers = {1,1,1}; unsigned char numbers[] = {1,1,1}; unsigned char* ptr = numbers; unsigned char numbers[] = {1,1,1}; unsigned char* ptr = numbers; .

也是因為程序違反了嚴格的別名規則 任何事情都可能發生:程序可能會打印某種結果、垃圾或崩潰。

此外,您對 unsigned short 的強制轉換假定了一定的 CPU 字節序。 因此,如果您的程序碰巧出現未定義的行為“打印某種結果”,則該結果將取決於 CPU 字節序。

以上可能會導致未定義的行為,對嗎?

(1)不僅行為是不確定的,但它永遠是不確定的。

另外,屏幕上會打印什么?

根據 (1) 未定義

這會在某些計算機中打印“1 1 0 2”嗎

它可能。 或者它可能不會。 這是可能的,因為任何結果都是可能的。 見(1)。

我們不確定最后一個字符是什么,但第 1 個 3 將被打印出來。

它們可能不會被打印好。 見(1)。

這段特殊的代碼:

unsigned char * numbers = {1,1,1};

不會編譯。

暫無
暫無

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

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