[英]Accessing array declared by malloc on STM32 Eval board
我目前正在將為其他嵌入式系統編寫的代碼移植到STM評估板(STM32F407)。 我在舊板上使用malloc的方式如下(為簡化起見,已簡化):
float* values = (float*)malloc(sizeof(float)*NO_OF_ATT);
values[0] = 1.0;
values[1] = 2.0;
values[2] = 3.0;
values[3] = 4.0;
該代碼按預期工作。 但是,在STM板上,當我運行此代碼時,似乎無法以這種方式訪問數組,而不是它的值僅輸出3.85205412e-034之類的值。 我以C表示法x [y]等於*(x + y)? 任何人都可以幫助我嘗試了解正在發生的事情嗎? 提前致謝!
編輯:這是非簡化的代碼:
l = (dllist*)calloc(sizeof(dllist),0);
l->Distance = 0;
for (int i = 0; i < NO_OF_ATT; i++)
{
l->Value[i] = featureValues[i];
if (i == (NO_OF_ATT - 1))
{
l->Value[i] = (int)featureValues[i];
}
}
sglib_dllist_add(&queryList, l);
featureValues數組具有正確的值,但l-> value數組沒有。 截圖:
編輯2:
結構定義:
typedef struct dllist {
float Value[NO_OF_ATT];
float Distance;
struct dllist *ptr_to_next;
struct dllist *ptr_to_previous;
} dllist;
我只想澄清一下:我的代碼在Visual Studio和第二個嵌入式系統中運行良好。 它在我的STM板上無法正常工作。
您沒有正確使用calloc:
l = (dllist*)calloc(sizeof(dllist),0);
void* calloc (size_t num, size_t size);
為一個num元素數組分配一個內存塊,每個元素的大小為字節長,並將其所有位初始化為零。
您要的是sizeof(dllist)
零尺寸的元素。 換句話說,您請求calloc
為您分配零字節,並且它返回NULL指針,如您的屏幕快照所示。
嘗試將上述calloc
呼叫替換為:
l = (dllist*)calloc(1,sizeof(dllist));
float* values = calloc(sizeof(float)*NO_OF_ATT,0);
values[0] = 1.0;
values[1] = 2.0;
values[2] = 3.0;
values[3] = 4.0;
這將使用0初始化所有變量。現在使用它來打印值...
printf("%f",values[<any index you wanna print>]);
它應該正確打印,實際上malloc也可以。 但請讓我知道您的打印方式(發布這些語句並輸出,如果仍然這樣的話)
編輯
在l的結構中,當您聲明該float數組的時間時,您只需要為那個數組分配內存。
l = (dllist*)calloc(sizeof(dllist),0)
dllist是您的結構...正確嗎? 因此,當給那個分配內存時,您在結構中提到的任何大小的數組都會被初始化。現在,當您分配值時,請使用此語法。
*(l->values[i]) = featureValues[i] ;
*or*
*(l.(values + i)) = featureValues[i] ;
這應該可以解決您的問題
如您在調試屏幕截圖中所見, l
變量的地址為0x00000000
。 這意味着calloc
因為沒有空間分配請求的大小而返回NULL
。
首先,每次使用malloc calloc等時, 必須檢查其返回值:
retPointer = malloc(sizeof(yourStruct);
if (retPointer == NULL)
{
// There wasn't room into heap memory
}
對於許多MCUs
地址0
是ISP (Initial Stack Pointer)
,地址0x00000004
(在32位存儲空間中)是IPC (Initial Program Counter)
。 這些地址屬於閃存,因此無法通過簡單的分配進行修改。
如果嘗試在十六進制中顯示array[0]
a和array[1]
值,則可以看到在鏈接描述文件中編程的ISP
和IPC
值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.