【问题标题】:Lvalues, Rvalues and Array Initialisation in CC中的左值,右值和数组初始化
【发布时间】:2011-12-13 13:30:23
【问题描述】:

能够定义一个数组,例如

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

像这样传递一个指向右值的指针是行不通的:

my_func(&a);

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

【问题讨论】:

  • 这可能是相关的:stackoverflow.com/q/8380348/726361
  • 如果您唯一的问题是重新初始化数组而不重新编译,那么您可以从文件或数据库中读取它。 (不要忘记尺寸!)。
  • 好点 - 我认为这可能是要走的路。我现在正在从 python 回到 C,因此所有这些(可能)关于基础的愚蠢问题......

标签: c arrays unit-testing pointers rvalue


【解决方案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;,然后不要用&amp;b 打电话给他们。使用&amp;b 传递指针 的地址,而不是它指向的地址。

【讨论】:

  • 不错的建议,看起来像一个整洁的解决方案。我认为 memcpy 路线只会进一步混淆事物并引入潜在的可移植性问题。我会留下那个。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    这是一种选择:

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

    【讨论】:

      猜你喜欢
      • 2015-03-08
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多