【发布时间】:2016-02-18 13:59:02
【问题描述】:
如果我们在SomeFunction 中定义一个数组,它在其范围内是有效的。但它实际上存储在哪里?局部变量通常存储在堆栈上,但我问自己是整个数组存储在堆栈上,还是只是指向数据字段的指针,数据实际存储在其中(比如调用在堆上分配内存的 malloc)。谈论在微控制器中的实现。
所以这个问题也让我想到了另一个问题。如果数据存储在堆中,如果指针将被保存到pdata并在不同的范围(SomeOtherFunction)中访问,这是否是一个有效的操作?数据是否可以在那里使用,或者我如何知道数据是否不再有效?
#define DATAFIELDLEN 127
static uint8_t* pdata;
static void SomeFunction()
{
uint8_t dataField[DATAFIELDLEN] = {};
// Write some stuff to the datafield
pdata = dataField; // Save pointer to the datafield
}
static void SomeOtherFunction()
{
// Use datafield here
for(uint8_t ii=0; ii<DATAFIELDLEN; ii++){
// Dereference Data here
someOperation(pdata[ii]); // <-------- is the data valid here?
}
}
void main()
{
SomeFunction();
SomeOtherFunction();
}
另一种可能性是将这个文件的全局范围内的数据字段定义为static。然后数据存储在零初始化数据中,在整个文件中有效。但是在我提出的方法中,我想通过不始终保持此数据字段可用来节省 RAM 中的一些空间。或者还有其他有用的做法吗?
【问题讨论】:
-
您为什么不查找 C11 草案标准,
6.2.4 Storage durations of objects? -
"local" 是范围问题,而不是生命周期问题。不要将其与自动变量混淆!
标签: c arrays memory scope lifetime