C中的左值,右值和数组初始化

时间:2011-12-13 13:30:24

标签: c arrays unit-testing pointers rvalue

能够定义数组,例如

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);

我的问题是,是否有任何其他方法可以轻松初始化一系列值而不受这些限制? (特别是为了便于编写许多类似的单元测试,而不是每个测试都有一组唯一的数组名称)

3 个答案:

答案 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传递指针的地址,而不是它指向的地址。