![](/img/trans.png)
[英]modified after being freed - returning a C array of `c_str` (const char*) within a struct
[英]Const Char array being modified to all 0s for AVR micro written in C
我正在幫助一位朋友在他的AVR上運行圖形液晶顯示器,幾個月前所有工作都沒有問題,從那以后它一直沒有被觸及。 該芯片現已從ATMega32換成ATMega164P。 基本上相同的芯片有更多的閃存,因為這種變化很多代碼已停止工作。
我們縮小了發生錯誤的位置,但無法糾正錯誤。 它是我們傳入指向const char字符串的指針,並嘗試打印該字符串,但由於某種原因堆棧(堆,其他?)被破壞,指針包含全部零。 有沒有人有任何想法如何發生這種情況? 我們啟用了-O1級優化,這是正確計時所必需的,我們已經切換到winAVR編譯器,沒有任何更改。 我們也無法訪問調試器,只能進行有限的“打印”樣式調試。
以下是導致問題的代碼部分:
//in the header file that is included
int SGCTEXTStringF(int column, int row, int font, int colour, const char* text);
//Call the function
SGCTEXTStringF(0, 0, 0x10, SGCColour(255,255,255), "text");
//Function
int SGCTEXTStringF(int column, int row, int font, int colour, const char* text){
unsigned char bytes[23]={0};
//...Code to communicate with LCD and set up a 'print string'
if(text[0] == 0) {
bytes[6] = 'a';
bytes[7] = 't';
bytes[8] = 'e';
bytes[9] = 's';
bytes[10] = 't';
}
//..more code to finish sending the array
}
現在顯示器在代碼運行時打印'atest',這表明const char數組是多少為零? 我也試過以下幾行也都打印'atest'
if(text[1] == 0) //prints 'atest'
if(*text== 0) //prints 'atest'
if(text != 0) //prints 'atest'
這表明它獲得了一個有效的指針,但它似乎指向全零。
我們還嘗試將對方法的調用更改為:
const char * string = "test";
SGCTEXTStringF(0, 0, 0x10, SGCColour(255,255,255), string);
這個代碼在幾個月前就已經開始工作,我們甚至有一個運行的視頻,現在程序中的每個函數都表現出相同的問題,傳遞的char數組(在堆棧上?)似乎不起作用,被清除為0。
如果有興趣的話,我可以安排托管完整源代碼的副本。 任何幫助或指針都表示贊賞!
ATMega164P不是ATMega32的替代品,而是ATMega16的替代品。 對於ATMega32,您需要ATMega324P。 如果您正在使用ATMega32的存儲器映射(具有雙EEPROM,SRAM和閃存),則您的字符串可能已落在內存中,而該內存根本不存在。 對於移植問題,您可以查看Atmel的移植指南 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.