簡體   English   中英

訪問STM32評估板上的malloc聲明的數組

[英]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地址0ISP (Initial Stack Pointer) ,地址0x00000004 (在32位存儲空間中)是IPC (Initial Program Counter) 這些地址屬於閃存,因此無法通過簡單的分配進行修改。

如果嘗試在十六進制中顯示array[0] a和array[1]值,則可以看到在鏈接描述文件中編程的ISPIPC值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM