C ++指针转换不起作用

时间:2016-10-27 09:19:01

标签: c++ pointers memory casting

我做错了什么,消息框中的值是不同的。这是在Windows上的32位应用程序。我读过的所有内容都表明,重新解释广播并不是必要的,即使我尝试它仍然无法奏效。还试过更大的数据类型来保存指针,但在32位int或DWORD上应该没问题。

var objects_json = JsonConvert.DeserializeObject<List<object>>(test);

2 个答案:

答案 0 :(得分:2)

您正在显示两个不同变量的地址,a_ptr和a_recasted_ptr。它们不在同一地址存储器中 移除&电话中的snprintf(),您就完成了。

但是,代码很糟糕...... 试试这个:

A a;
A* a_ptr=&a;

SIZE_T a_ptr_address = (SIZE_T)a_ptr;
A* a_recasted_ptr = (A*)a_ptr_address;

//Display Result
char debugString[20];
snprintf(debugString, 20, "%0p", a_ptr);
MessageBoxA(NULL, debugString, NULL, NULL);
snprintf(debugString, 20, "%0p", a_recasted_ptr);
MessageBoxA(NULL, debugString, NULL, NULL);

答案 1 :(得分:-1)

  1. 将MessageBox替换为MessageBoxA并删除(const char *)强制转换。

  2. 在此示例中,您有3个不同的变量:a_ptr,a_ptr_address和a_recasted_ptr。 由于您有3个变量,因此它们具有不同的地址,因为它们是不同的变量。但是,它们的价值可以相同。 例如,a_ptr和a_recasted_ptr具有不同的地址,但具有相同的值。 在您的示例中,您显示变量的地址,但不显示其值。

  3. 修正了可能的版本:

    struct A {};
    // assign some dummy value to a_ptr
    A* a_ptr = (A*)0x00000007;
    
    DWORD_PTR a_ptr_address = (DWORD_PTR)a_ptr;
    A* a_recasted_ptr = (A*)a_ptr_address;
    
    //Display Result
    char debugString[40];
    sprintf_s(debugString, "Value of %08x=%u", &a_ptr, (DWORD_PTR)a_ptr);
    MessageBoxA(NULL, debugString, NULL, NULL);
    sprintf_s(debugString, "Value of %08x=%u", &a_recasted_ptr, (DWORD_PTR)a_recasted_ptr);
    MessageBoxA(NULL, debugString, NULL, NULL);
    

    编辑:根据评论修复错误