访问STM32 Eval板上malloc声明的数组

时间:2015-09-07 04:56:46

标签: c embedded stm32

我目前正在将我为其他嵌入式系统编写的代码移植到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数组不具有该值。 截图:enter image description here

编辑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板上没有按预期工作。

3 个答案:

答案 0 :(得分:2)

您没有正确使用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));

答案 1 :(得分:0)

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当你声明浮点数组那个时候,你只需要为那个分配内存。在为那个浮点数组分配内存之后

l = (dllist*)calloc(sizeof(dllist),0)

dllist是你的结构......对吗? 因此,当为那个时间分配内存时,你在结构中提到的任何大小的数组都将被初始化。 现在,当您分配值时,请使用此语法..

*(l->values[i]) = featureValues[i] ; 
           *or*
*(l.(values + i))  = featureValues[i] ; 

这应该可以解决您的问题

答案 2 :(得分:0)

正如您在调试屏幕截图中看到的,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)。那些地址属于flash,然后无法通过简单的分配进行修改。

如果您尝试在HEX中显示array[0] a和array[1]的值,则可以在链接描述文件中看到您的ISPIPC值。