1

我正在用 C 语言编写一个算法,它将指向无符号整数数组的指针作为输入进行某种过滤并将结果返回到相同的指针数组。我这样做了:

static void Filtering(Inst_t *psStruct, uint8 *arraypointer)
{
    uint8 *arrayFilter; 
    uint32 i, n = 0, uCount;
    uCount = psStruct->uCount;   

    for (i = 0; i < uCount; i++)
    {        
       arraypointer[i]  = (arraypointer[i] + arraypointer[i - 1] +  arraypointer[i + 1])/3;     
    }
}

这样做会覆盖数据。但我不希望这种情况发生。所以想要制作指针指向的数组数据的本地副本,然后使用它来计算平均值并将计算值传回。

我正在考虑分配一个 *arraypointer 大小的数组,并用指针数组值初始化它,并改用这个本地副本。从理论上讲,这对我来说很有意义,但不确定这是否是最好的方法。

非常感谢任何解决此问题的指针/代码。请帮忙。

提前致谢。

4

3 回答 3

1

当然。这是实现返回新数组的函数的完全合法的方式。

您可以这样做以快速复制元素:

uint8 *newarray = malloc(uCount * sizeof(uint8));
memcpy(newarray, arraypointer, uCount * sizeof(uint8));

/* do work on newarray */
return newarray;

请务必记录您的函数返回一个动态分配的数组,并确保在完成后释放它。

于 2013-02-27T07:30:13.260 回答
1

如果您不想修改数据,那么为什么要让函数这样做呢?与其试图发明方法来躲避自己的程序设计,不如改变函数的定义并以不同的方式实现它。

static void Filtering (Inst_t *psStruct, 
                       const uint8_t* source, 
                       uint8_t* result)

然后在调用者中:

uint8_t* filtered_buf = malloc (sizeof(buf));

Filtering(some_struct, buf, filtered_buf);

free(filtered_buf);
于 2013-02-27T08:10:23.910 回答
0

由于您似乎拥有该uCount字段中可用的元素数量,因此您当然可以创建一个本地副本。

如果您只想计算平均值(只读操作),我不明白为什么需要本地副本。

要创建副本,您需要执行以下操作:

const size_t num_bytes = psStruct->uCount * sizeof *local;
uint8 *local = malloc(num_bytes);
memcpy(local, arraypointer, num_bytes);

您当然应该在使用之前检查它local,并且在从函数返回之前检查它(除非您想要新数组作为结果,在这种情况下,完成后它成为调用者的责任)。NULLfree()returnfree()

于 2013-02-27T07:30:24.730 回答