【问题标题】:Passing an array pointer as a parameter将数组指针作为参数传递
【发布时间】:2018-05-14 14:25:19
【问题描述】:

我正在处理我的 I²C 读取函数,以将数组指针传递给函数并从缓冲区复制数据。

现在我只是在测试在代码块中传递数组以查看结果的方法。

我的问题:

  1. main 传递给函数的数组是否不正确?
  2. 我开发函数并将数组作为指针传递的方式也是一种好的代码策略吗?

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

uint8_t reaArr (uint8_t len, uint8_t *data);

int main(void)
{
    uint8_t receive[9];
    uint8_t k;

    receive[9] = reaArr(9, receive);

    for (k=0; k<9; k++)
    {
        printf("%d\n", receive[k]);
    }

    return 0;
}

uint8_t reaArr (uint8_t len, uint8_t *data)
{

    uint8_t arr[9] = {20, 55, 66, 33, 5, 4, 45, 27, 59}, i, arrIndex = len;
    for (i=0; i<arrIndex; i++)
    {
        data[i] = arr[i];
    }

    return *data;
}

【问题讨论】:

  • receive[9],此处索引超出范围,最大索引应为 8
  • 也是 reaArr 中的最后一条语句 return *data 返回数组数据的第一个元素,因为数组的名称是指向数组第一个元素的指针,所以基本上你取消引用指向第一个元素的指针数组数据,并返回它。
  • Re"from main without correct":没有什么?是不是少了一个字?请通过editing your question 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 问题应该看起来好像是今天写的)。

标签: arrays c pointers parameter-passing


【解决方案1】:

从main传给函数的数组不正确吗?

是的,传递数组本身是正确的,但是您在此处将函数的结果分配给第 10 项:receive[9] = ...。请记住,C 中的数组使用 0 索引,所以这是没有键的。在这种情况下,您实际上不需要从函数中返回任何内容。考虑将其更改为:

void reaArr (uint8_t len, uint8_t *data);

我开发函数并将数组作为指针传递的方式也是一种好的代码策略吗?

一般来说,是的,调用者分配是首选,因为这样可以将分配和算法分开。如果这个例子是一个真正的 I2C 驱动程序,那么你会从函数内部的硬件缓冲区中读取,而不是从本地数组中读取。

【讨论】:

    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多