我目前正在将我为其他嵌入式系统编写的代码移植到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板上没有按预期工作。
答案 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
地址0
是ISP (Initial Stack Pointer)
而地址0x00000004
(在32位内存空间中)是IPC (Initial Program Counter)
。那些地址属于flash,然后无法通过简单的分配进行修改。
如果您尝试在HEX中显示array[0]
a和array[1]
的值,则可以在链接描述文件中看到您的ISP
和IPC
值。