【问题标题】:Dereferencing pointer in Code Composer Studio在 Code Composer Studio 中取消引用指针
【发布时间】:2013-06-11 19:18:15
【问题描述】:

我在一个无符号字节数组中收到一个值,我想将其取消引用为浮点数。将 ptr 作为 uint8_t* 指向一个字节数组,其中包含四个值 0,0,0xCD,0x42(这是一个小端系统)。

float val = *(float*)ptr;

返回 -1.34e8

当我输入时:

*(float*)ptr;

在该部分代码中遇到断点后的表达式窗口中,它给了我预期的 102.5。此外,当我输入时:

*(float*)(ptr - 1);

我得到了不正确的 -1.34e8,好像编译器使用 ptr - 1 而不是我输入的内容。

我很困惑 - 我在这里遗漏了什么吗?

【问题讨论】:

  • 基本上 deref 是正确的。如果你 printf("%p", ptr);你得到的地址可能不是 4 字节对齐(或至少 2 字节)吗? (这在某些平台上可能是必需的)。顺便说一句,(ptr-1) 向后一个字节(因为它是一个 uint8_t *),而不是通常返回一个浮点大小。
  • 是的,这很奇怪。 ptr - 1 向后一个字节,所以就好像我的原始代码 (float)ptr;正在查找一个字节并从那里而不是从 ptr 解释四个浮点字节。我的观点是,当代码在调试器中停止时, (float)ptr 给了我我期望在运行时得到的东西,而 (float)(ptr-1)给了我在运行时实际得到的东西。
  • 如果 ptr 值未正确对齐,编译器可能会对其进行舍入。试试 printf("%p", ptr);在源代码中,然后检查结果是否与调试器给您的结果相同(只是在 dbg 中打印指针本身)。
  • 另外,为了测试,只需在 uint8_t* 中传递一个真正的浮点值,例如浮动 f = 102.5; yourfunct((uint8_t*)&f);看看这是否有效。
  • 我做了 printf,转到内存中的位置并验证它指向第一个 0。这与调试器匹配,但值仍然不同。但我认为这一定是对齐的事情,因为取消引用 ptr + 1 仍然给我相当于 ptr - 1。编译器这样做是正常的,还是这只是 CCS 成为噩梦的另一种情况?

标签: c++ pointers code-composer


【解决方案1】:

基本上 deref 是正确的。

如果您printf("%p", ptr);,您得到的地址可能不是 4 字节对齐(或至少 2 字节对齐)吗?这在某些平台上可能是必要的。

为了测试,只需在 uint8_t* 中传递一个真正的浮点值,例如

float f= 102.5; 
yourfunct((uint8_t*)&f); 

看看是否可行。

【讨论】:

    【解决方案2】:
    *(float*)(ptr - 1); 
    

    和这个一样

    ptr--; //move the pointer to point to charackter in front of the previous one
    *(float*)ptr;
    

    这是你的意图吗? 或者您只是想从指向 ptr 的值中减去 1。

    【讨论】:

    • 我不想从中减去。我的意思是,在运行时将 ptr 取消引用为浮点数就像我已将指针取消引用回一个字节。
    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多