能够定义数组,例如
int a[] = {1,2,3};
非常方便,但是,数组a是一个r值,所以我不能随后更改a中的值,例如
a[] = {4,5,6};
想要这样做的上下文是编写一堆单元测试,我将数组输入函数并测试输出。我正在使用不同的输入对相同的函数运行测试,并希望避免为我的输入数组提供唯一的名称,例如我必须这样做:
int test1_a[] = {1,2,3};
/* calls to functions */
int test2_a[] = {4,5,6};
/* calls to functions */
另外,如果我想将指向数组的指针传递给函数,我必须先将其转换为:
int a[] = {1,2,3};
int *b = a;
my_func(&b);
将指针传递给像这样的r值不起作用:
my_func(&a);
我的问题是,是否有任何其他方法可以轻松初始化一系列值而不受这些限制? (特别是为了便于编写许多类似的单元测试,而不是每个测试都有一组唯一的数组名称)
答案 0 :(得分:1)
这是一个选项:
#include <stdio.h>
#include <stdarg.h>
void ReinitArray(int* p, size_t cnt, ...)
{
va_list ap;
va_start(ap, cnt);
while (cnt--)
{
*p++ = va_arg(ap, int);
}
va_end(ap);
}
int array[5] = { 1, 2, 3, 4, 5 };
int main(void)
{
size_t i;
printf("array[5]=");
for (i = 0; i < 5; i++) printf("%d ", array[i]);
printf("\n");
ReinitArray(array, 5, 11, 22, 33, 44, 55);
printf("array[5]=");
for (i = 0; i < 5; i++) printf("%d ", array[i]);
printf("\n");
return 0;
}
输出:
array[5]=1 2 3 4 5
array[5]=11 22 33 44 55
您只需编写my_func(a);
,其中a
是数组名称。这相当于传递&a[0]
,即第一个数组元素的地址。您无法直接将整个数组作为C中的函数参数传递。
答案 1 :(得分:1)
如果我已正确理解你的问题。我想以下内容可以解决你的问题。
memcpy(a, (int[]){3, 2, 1}, sizeof a);
仅当您的c编译器支持复合文字(c99以后)时。
要指定标准,可以将gcc调用为“gcc -std = c99 -Wall -pedantic”。
答案 2 :(得分:1)
如果您已经有想要传递给函数的值,为什么不使用多维数组呢?
int a[][] = {
{ 1, 2, 3 },
{ 4, 5, 6 }
}
for (int i = 0; i < 2; i++)
{
/* Call functions with 'a[i]' as argument */
}
此外,如果您调用的函数需要一个数组,并且您有一个例如int a[] = {...}; int *b = a;
,然后不要使用&b
调用它们。使用&b
传递指针的地址,而不是它指向的地址。