我試圖通過下面的代碼訪問 int 值的單個位元組。我的問題是,每當我嘗試long int i=0;
從代碼中洗掉時,都會出現分段錯誤。發生這種情況有什么原因嗎?我沒有在代碼中的任何地方使用 I 。
// Online C compiler to run C program online
#include <iostream>
int main() {
// Write C code here
unsigned int* a;
unsigned char* b1;
unsigned char* b2;
unsigned char* b3;
unsigned char* b4;
*a= 4294967295; //set to max val (4 bytes)
//*************************
long int i=0;//Q. Why long int/long long int?
//*************************
b1 = (unsigned char*)(a);
b2 = b1 (long long int)1;
b3 = b1 (long long int)2;
b4 = b1 (long long int)3;
std::cout <<*a<<" "<<(int)*b1<<" "<<(int)*b2<<" "<<(int)*b3<<" "<<(int)*b4<<std::endl;
return 0;
}
uj5u.com熱心網友回復:
這表現出未定義的行為:
unsigned int* a;
*a= 4294967295; //set to max val (4 bytes)
指標變數a
永遠不會初始化為任何東西,因此它指向一個隨機記憶體地址。將任何內容寫入該隨機垃圾地址(通常)會導致分段錯誤。添加另一個變數會改變行為(由于程式的記憶體布局發生變化)只是巧合。
uj5u.com熱心網友回復:
發布的程式具有未定義的行為(1):
unsigned int* a; // Uninitialized local variable, it has an indeterminated value.
*a = 4294967295; // Where is it assigned?
不幸的是,它恰好在您的環境中“作業”,您應該啟用更多警告。
從 C 20 開始,您可以使用std::bit_cast重新解釋物件表示:
#include <array>
#include <bit>
#include <iostream>
int main()
{
auto a{ 4294967295LL };
using repr_t = std::array<std::byte, sizeof(a)>;
auto b{ std::bit_cast<repr_t>(a) };
// The following outputs: 4294967295 255 255 255 255 0 0 0 0
std::cout << a << " ";
for (auto i : b)
std::cout << ' ' << static_cast<int>(i);
std::cout << '\n';
}
(1) 參見例如:
未定義、未指定和實作定義的行為
C 標準究竟在哪里說取消參考未初始化的指標是未定義的行為?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/470452.html