【发布时间】:2019-06-03 15:55:56
【问题描述】:
我一直在努力提高我在 C 方面的技能和知识。今天我尝试创建一个接受任何类型数组的函数,但我没有找到成功的方法,我使用的是 ANSI C我试图将它作为一个空指针传递,但是当我试图通过使用参数操作的内存时,编译器会抱怨。有没有办法实现它?我在想这可能可以通过预处理器指令来完成,但我不确定。
PS:我的目标不是用数据填充数组,这只是一个函数,而是理解和学习如何在我不知道数据类型的情况下传递数据,或者让我的函数不仅仅使用一种数据。
这是编译过程的输出:
array_test.c:在函数“array_fill”中:
array_test.c:34:13: 警告:算术中使用的“void *”类型指针 [-Wpointer-arith]
*(数组 + i) = 数据;
^
array_test.c:34:5: 警告:取消引用 'void *' 指针
*(数组 + i) = 数据;
^~~~~~~~~~~~~~~
array_test.c:34:5: 错误:无效表达式的使用
*(数组 + i) = 数据;
^
这是我的代码:
#include <stdio.h>
#define array_length(array) (sizeof(array)/sizeof(array[0]))
#define ARBITRARY_SIZE 10
typedef enum
{
false,
true
} bool;
int array_fill(void*, int, int);
int main(int argc, char* argv[])
{
int array[ARBITRARY_SIZE];
int i;
array_fill(array, array_length(array), 0);
for(i = 0; i < array_length(array); i++)
{
printf("array[%d]: %d\n", i, *(array + i));
}
return 0;
}
int array_fill(void* array, int size, int data)
{
int i;
for(i = 0; i < size; i++)
{
*(array + i) = data;
}
/*I will implement a check later, in case of errors.*/
return 0;
}
【问题讨论】:
-
您需要转换为
char*才能使算术有效,但这相当于memset -
但是,如果我将它转换为指向 char 的指针,它会在任何地方工作吗?该解决方案编译器是否依赖?这是最好的解决方案吗?
-
你应该以字节为单位传递长度,否则没有意义。
-
您的示例不是很有趣,因为无论数据类型如何,都可以轻松解决零填充问题(并且可以使用标准函数
memset()完成)。我建议您修改示例以使其更有趣 - 即无法使用memset()解决)。