[英]uint32_t pointer to the same location as uint8_t pointer
#include <iostream>
int main(){
uint8_t memory[1024];
memory[0] = 1;
memory[1] = 1;
uint32_t *test = memory;
//is it possible to get a value for *test that would be in this example 257?
}
我想創建一個 uin32_t 指針,指向與 uint8_t 指針相同的地址。 這可能不使用 new(adress) 嗎? 我不想丟失地址中的信息。 我知道指針只是地址,因此我應該能夠將 uint32_t 指針設置為相同的地址。
此代碼產生錯誤:
invalid conversion from 'uint8_t*' to 'uint32_t*' in initialization
這將違反所謂的嚴格別名規則,因此無法做到。 悲傷,但真實。
使用memcpy
復制數據,在許多情況下,編譯器將優化內存復制並生成與使用 cast 相同的代碼,但以符合標准的方式。
如前所述,由於嚴格的別名規則,您無法將uint8_t *
轉換為uint32_t *
,但您可以將uint32_t *
轉換為unsigned char *
:
#include <iostream>
int main(){
uint32_t test[1024/4] = {}; // initialize it!
auto memory = reinterpret_cast<unsigned char *>( test );
memory[0] = 1;
memory[1] = 1;
std::cout << test[0] << std::endl;
}
由於Endianness ,這不是可移植的代碼,但至少它沒有 UB。
這個問題完全忽略了字節序的概念; 雖然您的示例的低字節和高字節具有相同的值,但如果交換字節順序,則沒有區別; 但在這種情況下; 你的號碼會出乎意料的錯誤。
因此,沒有可移植的方式來使用結果數字。
uint32_t *test =(uint32_t*) memory;
uint32_t 表明test
指向的內存應該包含 uint32_t 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.