如何将指针作为存储数组地址的参数传递

时间:2016-01-14 12:48:48

标签: c arrays function pointers

我会尽我所能来实现我正在努力发展的东西:

  1. 我已经将 function2 开发成一个库,它返回一个数组的地址。

    uint16_t * readArray(void)
    {
      uint16_t array[5] = {1, 2, 3, 4, 5};
      return array;
    }
    
  2. 来自同一个库的另一个 function1 必须将此地址存储到作为参数传递的指针中。此函数不返回任何内容,但地址需要保存在指针中。

    void readAddress(uint16_t *pointer_)
    {
      pointer_ = readArray();
    }
    
  3. 来自' main '函数,需要打印数组中的值。

    uint16_t *values;
    
    int main(void)
    {
      ...
      readAddres(values);
      print(values);      // This function prints the complete array
      ...
    }
    
    • 功能声明被有目的地省略( library.h )。
  4. 我发现这样做,存储在'指针_'中的值不是数组的地址。

    这是一个指针问题,如果有人能帮我理解如何发展这样的情况,我会很高兴。

    KR!

3 个答案:

答案 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);