【问题标题】:How to properly pass an array as a function argument?如何正确地将数组作为函数参数传递?
【发布时间】:2017-12-30 17:19:22
【问题描述】:

当我尝试将数组发送到函数时,我收到错误。

这是我的 minunit 测试程序:

#include "minunit.h"
#include "calc.h"
#include <stdio.h>

int tests_run = 0;

 static char * test_Repetitve() {
     mu_assert("error in test_Repetitive, Repetitive != 7", HistogramArray({1,2,3,4,5,6,7})== 7);
     return 0;
 }

 static char * all_tests() {
         mu_run_test(test_Repetitive);
     return 0;
 }

 int main(int argc, char **argv) {
     char *result = all_tests();
     if (result != 0) {
         printf("%s\n", result);
     }
     else {
         printf("ALL TESTS PASSED\n");
     }
     printf("Tests run: %d\n", tests_run);

     return result != 0;
 }

我有问题的行是

mu_assert("error in test_Repetitive, Repetitive != 7", HistogramArray({1,2,3,4,5,6,7})== 7);

它进入这个函数:

    int HistogramArray(int one[])
{
    int arrchk[TWENTY+ONE] = { ZERO }, i, j,counter=0;//arrchk is an array that counts how many times the number appears.
    for (i = ZERO; i<N; i++)
        arrchk[one[i]]++;
    for (i = ZERO; i<TWENTY+ONE; i++)
    {
        if (arrchk[i] != ZERO) 
                        {
                         printf("the number is %d ", i);//printing the histogram.
                          counter++;
                        }
        for (j = ZERO; j<arrchk[i]; j++)
        {
            printf("*");

        }
        if (arrchk[i] != ZERO)printf("\n"); 
    }
return counter;

我基本上需要检查直方图函数中的计数器是否为 7,有什么建议吗?

【问题讨论】:

  • {1,2,3,4,5,6,7} 不是一个数组,它是一个大括号括起来的初始化器。它本身没有类型。
  • 我没有看到任何images ;-)
  • 请发帖minimal reproducible example,以便我们重现问题。

标签: c arrays function function-call compound-literals


【解决方案1】:

问题在于语法HistogramArray({1,2,3,4,5,6,7}),这里{1,2,3,4,5,6,7} 本身不是一个数组,它是一个用大括号括起来的初始化器列表。 HistogramArray() 函数需要一个数组作为参数。

但是,您可以使用 compound literal

的语法来使用它
  HistogramArray((int []){1,2,3,4,5,6,7})

像数组一样使用它。

引用C11,第 6.5.2.5 章,

一个后缀表达式,由带括号的类型名称后跟大括号括起来的 初始化器列表是复合文字。它提供了一个未命名的对象,其值由初始化列表给出。

如果类型名称指定一个未知大小的数组,则大小由 6.7.9 中指定的初始化器列表,复合文字的类型是 完成的数组类型。 [...]

因此,这为您提供了一个未命名的数组,该数组使用大括号括起来的列表中的元素进行初始化。

【讨论】:

  • @AlexKreinis 严格来说,这不是将数组作为函数参数传递,这是编写数组字面量。数组不能传递给函数。在 tbis 情况下传递给函数的是指针,而不是数组。它仍然对您有用,但理想情况下您应该知道其中的区别。
猜你喜欢
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 2017-03-18
  • 2014-04-02
相关资源
最近更新 更多