C 为结构成员赋值

C 为结构成员赋值,c,pointers,struct,embedded,C,Pointers,Struct,Embedded,为什么我不能赋值 A1->a |=5 #include <stdio.h> typedef struct { int a; int b; int c; } A; int main(){ A *A1 = (A *) 0x100; //this is for example, an address of a register printf("A1.a is at %p\n", &(A1->a)); printf("A1.

为什么我不能赋值

A1->a |=5

#include <stdio.h>

typedef struct {
    int a;
    int b;
    int c;
} A;

int main(){
    A *A1 = (A *) 0x100; //this is for example, an address of a register

    printf("A1.a is at %p\n", &(A1->a));
    printf("A1.b is at %p\n", &(A1->b));
    printf("A1.c is at %p\n", &(A1->c));

    A1->a |= 5; //this line doesnt work
    printf("A1.a = %d ", A1->a);
    return 0;
}
#包括
类型定义结构{
INTA;
int b;
INTC;
}A;
int main(){
A*A1=(A*)0x100;//例如,这是寄存器的地址
printf(“A1.a位于%p\n”&(A1->a));
printf(“A1.b位于%p\n”&(A1->b));
printf(“A1.c位于%p\n”&(A1->c));
A1->a |=5;//这行不行
printf(“A1.a=%d”,A1->a);
返回0;
}
A1->a |=5
A *A1 = (A *) 0x100;
你的问题是这条线。您不能引用不属于您的地址。您不知道在此地址中,您可以读取或写入数据

您可以引用变量的地址:

A A0;
A *A1 = &A0;
你的问题是这条线。您不能引用不属于您的地址。您不知道在此地址中,您可以读取或写入数据

您可以引用变量的地址:

A A0;
A *A1 = &A0;

如果该代码应该在内存管理单元处于活动状态的计算机上运行,那么您最终将出现分段错误,因为您尝试访问的地址未映射到您的进程。请记住,您无法访问分配的内存空间以外的内存(除非您请求、malloc、mmap等)

如果它应该在没有激活MMU(在MCU上)的机器上运行,那么您可以自由访问任何内存地址(除非您没有激活该区域的任何内存单元保护)。基本上,您尝试访问三个寄存器(0x100、0x104、0x108,假设您在32位机器上运行)。请考虑“int”是一个有符号的数字,如果寄存器的位31设置为“1”,会发生什么情况?结果将被解释为已签名。现在尝试对有符号的数字使用位运算!!!!(当然不是你期望的结果)

如果希望设置第5位,则需要执行以下操作:

A1->a |= (1 << 5); // if a = 1 => a = 33
A1->a |=(1a=33

如果该代码应该在内存管理单元处于活动状态的计算机上运行,那么您最终将出现分段错误,因为您尝试访问的地址未映射到您的进程。请记住,您无法访问超出已分配内存空间的内存(除非您请求、malloc、mmap等)

如果它应该在没有MMU活动的机器上运行(在MCU上),那么您可以自由访问任何内存地址(除非您没有该区域的任何内存单元保护活动)。基本上,您尝试访问三个寄存器(0x100、0x104、0x108,假设您在32位机器上运行)。请考虑“int”是一个有符号的数字,如果您的寄存器将位31设置为“1”,会发生什么?结果将被解释为有符号。现在尝试对有符号的数字使用位运算!!!!(当然不是您期望的结果)

如果希望设置第5位,则需要执行以下操作:

A1->a |= (1 << 5); // if a = 1 => a = 33
A1->a |=(1a=33

您不能仅仅取消引用像
0x100
这样的随机内存地址。您的平台是什么?代码说它是一个寄存器地址。您的代码在Windows上运行,并且在地址0x100处没有寄存器。您不能简单地读取任意内存地址。0x100必须是目标上的有效读/写地址。它在STM3上也不是2也不能在您的电脑上使用。您不能仅取消引用像
0x100
这样的随机内存地址。您的平台是什么?代码说它是一个寄存器地址。您的代码在Windows上运行,并且在地址0x100处没有寄存器。您不能简单地读取任意内存地址。0x100必须是目标上的有效读/写地址。它不是零STM32上的er和PC上的er。代码表明,
0x100
是寄存器的地址。这被标记为嵌入式,因此使用malloc不是正确答案。也没有未定义的行为,PC不允许直接访问该地址。例如,定义良好但特定于POSIX风格操作系统的实现行为将引发SIGSEGV信号,Windows上定义良好的行为是从进程访问冲突返回0xC0000005。代码说
0x100
是寄存器的地址。这是标记为嵌入的,因此使用malloc不是正确的答案。也没有未定义的行为,PC根本不允许直接acc例如,POSIX风格操作系统上定义良好但具体实现的行为是发出SIGSEGV信号,而Windows上定义良好的行为是从进程访问冲突返回0xC0000005。