我会尽我所能来实现我正在努力发展的东西:
我已经将 function2 开发成一个库,它返回一个数组的地址。
uint16_t * readArray(void)
{
uint16_t array[5] = {1, 2, 3, 4, 5};
return array;
}
来自同一个库的另一个 function1 必须将此地址存储到作为参数传递的指针中。此函数不返回任何内容,但地址需要保存在指针中。
void readAddress(uint16_t *pointer_)
{
pointer_ = readArray();
}
来自' main '函数,需要打印数组中的值。
uint16_t *values;
int main(void)
{
...
readAddres(values);
print(values); // This function prints the complete array
...
}
我发现这样做,存储在'指针_'中的值不是数组的地址。
这是一个指针问题,如果有人能帮我理解如何发展这样的情况,我会很高兴。
KR!
答案 0 :(得分:3)
由于array[5]
是一个局部变量,因此当函数终止时它会被删除。
对于你的函数void readAddress(uint16_t *pointer_)
,它不能改变提供的指针的值,因为它是由Value传递的。你需要将它改为接受uint16_t**
作为参数。在修复{之后尝试这个{1}}:
readArray()
答案 1 :(得分:2)
我发现这样做,'pointer_'中存储的值不是数组的地址。
这是因为uint16_t array[5]
是函数readArray
的本地函数,并且在函数返回时会被销毁。
<小时/> 要使这项工作,您可以在堆中分配内存。堆中分配的内存保留在函数调用之间。
使用malloc()
系统调用在堆中分配内存。
答案 2 :(得分:1)
uint16_t * readArray(void)
{
uint16_t array[5] = {1, 2, 3, 4, 5};
return array;
}
只有在调用此函数时才会初始化数组,并在函数返回后立即销毁其堆。
pointer_ = readArray();
所以,总是指向null。 我曾经遇到过同样的问题,我的一位同事提出了一个优雅的解决方案,对你的情况来说是这样的:
void readArray(uint16_t *ptr)
{
uint16_t array[5] = {1, 2, 3, 4, 5};
for(i=0;i<4;i++)
ptr[i]=array[i];
}
void readAddress(uint16_t *pointer_)
{
readArray(pointer_);
}
在这种情况下,如果您愿意,您甚至可以摆脱readAddress方法并从主要调用
readArray(values);