[英]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.