我在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的数组,并用指针数组值初始化它,并使用这个本地副本。从理论上讲,这对我有意义,但不确定这是否是最好的方法。
非常感谢任何解决此问题的指针/代码。请帮忙。
提前致谢。
答案 0 :(得分:1)
不确定。这是实现返回新数组的函数的完全合法的方法。
您可以这样做以快速复制元素:
uint8 *newarray = malloc(uCount * sizeof(uint8));
memcpy(newarray, arraypointer, uCount * sizeof(uint8));
/* do work on newarray */
return newarray;
请务必记录您的函数返回动态分配的数组,并确保在完成后释放它。
答案 1 :(得分: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);
答案 2 :(得分:0)
由于您似乎在uCount
字段中有可用元素的数量,因此您当然可以创建本地副本。
如果您只想计算平均值(只读操作),我不明白为什么需要本地副本。
要创建副本,您可以执行以下操作:
const size_t num_bytes = psStruct->uCount * sizeof *local;
uint8 *local = malloc(num_bytes);
memcpy(local, arraypointer, num_bytes);
当然,您应该在使用前检查local
是否为NULL
,并在从函数返回之前检查free()
(除非您想要return
新数组结果,在这种情况下,调用者成为free()
完成后的责任。