遇到一個(gè)MonRiver的編譯器問(wèn)題與Keil的區(qū)別

如下語(yǔ)句:

uint32_t * valaddr;//定義一個(gè)地址變量

u8 a=0;//隨便定義一個(gè)變量

void Test(void){

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

}

void fuc1(void){

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

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

Test();//此處崩潰

}


上述代碼在keil中編譯正常,在STM32中可以正常運(yùn)行

在MounRiver中編譯正常,在CH32X03X中崩潰。

這個(gè)本質(zhì)上應(yīng)該是全局指針不能正常訪(fǎng)問(wèn)的問(wèn)題,麻煩盡快看一下,項(xiàng)目卡在這里了。


熱門(mén)產(chǎn)品 : CH32X035: 32位USB+USB PD單片機(jī)

問(wèn)一下什么原因,有什么辦法解決


這個(gè)可能和編譯器分配內(nèi)存策略有關(guān),Keil分配給a的地址后面還有閑置的空間,而MounRiver 的 (char *)a+1 就是不可操作區(qū)域


來(lái)自ChatGPT的回答


在你提供的代碼中,有一個(gè)問(wèn)題可能導(dǎo)致崩潰:

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

這一行將一個(gè)8位的u8類(lèi)型的變量 a 的地址賦給了 valaddr,但后面在 Test() 函數(shù)中卻將其視為32位的 uint32_t 進(jìn)行操作,這可能導(dǎo)致未定義的行為,甚至崩潰。這是因?yàn)?a 只有一個(gè)字節(jié),但你在 Test() 函數(shù)中試圖操作4個(gè)字節(jié)。

如果你想要通過(guò) Test() 函數(shù)增加 a 的值,可以將 valaddr 聲明為指向 u8 類(lèi)型的指針:

u8?*valaddr;??//?指向u8類(lèi)型的指針

u8?a?=?0;?????//?隨便定義一個(gè)變量

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

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

????*valaddr?+=?1;????//?a?+=?1?此處正常

????Test();???????????//?此處不再崩潰
}

這樣就能夠正確地對(duì) a 進(jìn)行操作。



這些都試過(guò)了,不行的。不信你可以親自試試。這個(gè)是編譯器的bug。


您好,您的另一個(gè)帖子中回復(fù)了相關(guān)內(nèi)容,沒(méi)有復(fù)現(xiàn),后續(xù)可以將程序發(fā)送到郵箱yangy@wch.cn,這邊定位一下問(wèn)題。


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频