C语言 强行给内存地址赋值

时间:2024-03-28 07:12:06

最近看STM32代码,有这样一段话不理解
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
然后我就思考了下,不就是定义一个宏,然后声明一个结构体变量,进行赋值么?
然后我随便定义了一个地址,强制转换成一个结构体指针类型,代码如下:
typedef struct
{
unsigned char age;
unsigned char score;
}student;
#define A ((student *) 0x12345678)
int main(int argc, char
argv[])
{
unsigned char age=0 ;
A->age=100;
age=A->age;
printf(“age %d\n”,age);
return 0;
}
运行时,程序直接崩溃。然后查阅经典资料,《C和指针》C语言 强行给内存地址赋值
划线部分大致意思,在一个未知的地址,强行赋值,可能会改变程序本身某一部分的内存段,导致崩溃。
随后,我随便定义了一个结构体类型的变量,然后读出其内存地址。可以运行。代码如下:
typedef struct
{
//char name[20];
unsigned char age;
unsigned char score;
}student;
define A ((student *) 0x12345678)
int main(int argc, char
argv[])
{
unsigned char age=0 ;
student test;
printf("%p\n",&test);
A->age=100;
age=A->age;
printf(“age %d\n”,age);
return 0;
}
其中,0x12ff40是我定义test后,取得到的内存地址。这样A指针就有了实际意义。
再反过来看STM32的IO定义
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
再引用经典《C和指针》,GPIOA,并不是用于访问某个变量,而是访问硬件本身。
这就意味着,如果使用GPIOA中的内容,那么就相当于改IO配置。换句话说,通过内存,建立起了IO与程序员的交互通道。