2

能够定义一个数组,例如

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

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

4

3 回答 3

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);wherea是一个数组名。这相当于传递&a[0]第一个数组元素的地址。您不能直接将整个数组作为 C 中的函数参数传递。

于 2011-12-13T13:51:05.260 回答
1

如果我正确理解了您的问题。我想以下内容应该可以解决您的问题。

memcpy(a, (int[]){3, 2, 1}, sizeof a);

仅当您的 c 编译器支持复合文字(c99 及更高版本)时。

要指定标准,gcc 可以调用为“gcc -std=c99 -Wall -pedantic”。

于 2011-12-13T13:51:42.923 回答
1

如果您已经有了要传递给函数的值,为什么不使用多维数组呢?

int a[][] = {
    { 1, 2, 3 },
    { 4, 5, 6 }
}

for (int i = 0; i < 2; i++)
{
    /* Call functions with 'a[i]' as argument */
}

此外,如果您调用的函数需要一个数组,并且您有一个 eg int a[] = {...}; int *b = a;,那么不要使用&b. 使用&b传递指针的地址,而不是它指向的地址。

于 2011-12-13T13:52:28.750 回答