【问题标题】:point to low byte address of variable in c [closed]指向c中变量的低字节地址[关闭]
【发布时间】:2016-04-27 12:39:51
【问题描述】:

我想知道这是否可行:

例如:

我们有 long Lvalue = 0xFF00f41a;

还有int *p;

我们能否指向左值的最后 2 个字节

点赞p=&Lvalue <<16;

p指向第一个16位值可以吗?

*p --> f41a;
*(p+1) --->0xFF00;

那么如果

p = 0xa011;

长左值---> 0xFF00a011

其实我需要位操作。我有 32 位值,但我只能发送 16 位,如果我更改 16 位,则必须更改 32 位值的前 16 位最后 16 位。

【问题讨论】:

  • 你的问题很困惑。你想要什么,这与指针有什么关系?请参阅How to Ask 并提供minimal reproducible example
  • 如果我理解正确,您想通过指针更改long 的较低int 部分;不,这是不可能的。它打破了严格的别名规则。

标签: c pointers bit bitwise-and


【解决方案1】:

如果您只想要较大的 32 位类型的 16 位,请为任务使用位掩码,例如,获取值的低 16 位:

long value = 0xFF00f41a;
long lower = value & 0xFFFF;

要改变值的低 16 位,使用位运算:

lower = <some thing new>;
value = (value & 0xFFFF0000) | lower;

不要使用指针来访问 32 位值的一部分,当你取消引用它时它会产生未定义的行为。

【讨论】:

  • 是的,但我需要更改更低并更改更低的值
  • @dev.burak 再次使用按位与和或更改下部。
【解决方案2】:

如果int 以 4 字节对齐(这似乎由gcc 保证,请参阅Casting an int pointer to a char ptr and vice versa),则以下简短示例将起作用:

#include <stdio.h>                                                                                                                                                                                             

int main() {                                                                                                                                                                                                   
    int v = 0xcafe;                                                                                                                                                              
    int *ip = &v;                                                                                                                                                                                              
    char *cp = (char*) ip;                                                                                                                                                                                     

    printf("%hhX\n", *cp); // FE on little-endian box                                                                                                                                                                                    
    printf("%hhX\n", *(cp + 1));                                                                                                                                                                               

    *cp = 0xbe;                                                                                                                                                                                                
    *(cp + 1) = 0xba;                                                                                                                                                                                          
    printf("%X\n", *ip);                                                                                                                                                                                       

    return 0;                                                                                                                                                                                                  
}

您可以保证int 对齐:

int main() {                                                                                                                                                                                                   
    __attribute__ ((aligned (4))) int v = 0xcafe;                                              

【讨论】:

  • 非常感谢@Victor Sorokin
  • 您正在通过 char 指针更改整数的一部分。这是 C 的坏习惯。
  • 为什么不好@flutter
  • @fluter 根据链接的答案,如果 int 对齐,这是众所周知的工作。
猜你喜欢
  • 2020-12-30
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多