【问题标题】:Can't pass integer in function C [duplicate]无法在函数 C 中传递整数 [重复]
【发布时间】:2021-03-09 05:35:42
【问题描述】:

我正在尝试在函数中创建一个维度为 n 的数组,我不明白为什么编译器会给我这个错误:

错误:可变大小的对象可能未初始化

警告:数组初始化器中有多余的元素

代码如下,程序当然没有完成,因为我无法让它工作,并且在类似的项目中它给了我同样的错误:

    #include <stdio.h>
#include <stdlib.h>

//given a number, find all binary numbers with that number of digits
int gen_num(int);
int main()
{
    int n;
    printf("Insert a number: ");
    scanf("%d",&n);
    gen_num(n);
    return 0;
}

int gen_num(int n){

    int num[n]={0};
    return 0;
}

如果我尝试不在声明中初始化,但例如我尝试要求用户输入一些值,它会给我同样的错误,因为数组是使用维度 0 创建的

提前致谢

【问题讨论】:

  • 提示:当您遇到错误时,只需将其直接粘贴到您最喜欢的搜索引擎中,作为发布问题之前要做的最少研究。
  • 提示:颠倒这些定义的顺序,您将不需要顶部几乎无用的声明。在 C 代码中,您应该首先编写前导函数,然后在结尾处或接近结尾处编写 main。
  • 问题是我使用的是 2011 C,所以这不应该发生,我一直使用这个符号,从来没有遇到过问题
  • C11 6.7.9/3 "要初始化的实体的类型应该是一个未知大小的数组或者一个完整的对象类型,不是变长数组类型 。” (强调我的)。
  • 你指的是什么符号?如果您的意思是 VLA(可变长度数组)int num[n],那不是问题。问题是 VLA 不允许使用的初始化程序。

标签: arrays c function recursion


【解决方案1】:

如果您真的打算使用动态大小的数组 (C99),那么根据定义,数组的大小在编译时是未知的,因此初始化语法将不起作用。您必须显式初始化(​​使用例如 for-loop 或 memset())。

【讨论】:

    【解决方案2】:

    使用calloc()动态分配和初始化数组。

    int gen_num(int n){
        int *num = calloc(n, sizeof(int));
    
        /* treat 'num' like an array of integers */
        num[3] = 3;
        
        free(num); 
        return 0;
    }
    

    如果你只调用一次gen_num(),你不必调用free(),你可以让内存泄漏。不过还是打个电话free()吧,这是个好习惯。

    另一种方法是

    int num[n];
    memset(num, 0, sizeof(int) * n);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 2018-01-13
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多