遇到一个MonRiver的编译器问题与Keil的区别

如下语句:

uint32_t * valaddr;//定义一个地址变量

u8 a=0;//随便定义一个变量

void Test(void){

(*valaddr)+=1;//a+=1

}

void fuc1(void){

valaddr=(uint32_t *)&a;//得到a的地址

*valaddr+=1; //a+=1 此处正常

Test();//此处崩溃

}


上述代码在keil中编译正常,在STM32中可以正常运行

在MounRiver中编译正常,在CH32X03X中崩溃。

这个本质上应该是全局指针不能正常访问的问题,麻烦尽快看一下,项目卡在这里了。

问一下什么原因,有什么办法解决


这个可能和编译器分配内存策略有关,Keil分配给a的地址后面还有闲置的空间,而MounRiver 的 (char *)a+1 就是不可操作区域


来自ChatGPT的回答


在你提供的代码中,有一个问题可能导致崩溃:

valaddr=(uint32_t *)&a;//得到a的地址

这一行将一个8位的u8类型的变量 a 的地址赋给了 valaddr,但后面在 Test() 函数中却将其视为32位的 uint32_t 进行操作,这可能导致未定义的行为,甚至崩溃。这是因为 a 只有一个字节,但你在 Test() 函数中试图操作4个字节。

如果你想要通过 Test() 函数增加 a 的值,可以将 valaddr 声明为指向 u8 类型的指针:

u8 *valaddr;  // 指向u8类型的指针

u8 a = 0;     // 随便定义一个变量

void Test(void) {
    (*valaddr) += 1;  // a += 1
}

void fuc1(void) {
    valaddr = &a;     // 得到a的地址

    *valaddr += 1;    // a += 1 此处正常

    Test();           // 此处不再崩溃
}

这样就能够正确地对 a 进行操作。



这些都试过了,不行的。不信你可以亲自试试。这个是编译器的bug。


您好,您的另一个帖子中回复了相关内容,没有复现,后续可以将程序发送到邮箱yangy@wch.cn,这边定位一下问题。


只有登录才能回复,可以选择微信账号登录