郝想喝可乐 2021-12-14 20:19 采纳率: 50%
浏览 22
已结题

C语言数组定义问题。

如果题目中说数组的大小是按输入多少算的,那在定义的时候该怎么定义数组

  • 写回答

1条回答 默认 最新

  • 黑猫学长呀 2021-12-14 20:59
    关注

    参考例程04element_is_variable_test.c
    例子中所有测试代码都是用gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0进行编译的。

    test1函数是可行的。

    但是网上也有人说编译不过,貌似原因在于使用的编译器不一样,听说C99标准支持,有的标准不支持。

    test2编译不过,定义int a[num];的时候,num是个不确定的值。

    test3/4/5都是可行的。

    由此得出结论:
    数组元素中个数必须为常量,不能为变量,所述不是很正确,即使是变量也有可能可以。其实其原意应该是数组元素中个数必须是确定,不能是不确定的个数。即使元素个数是个变量,但是只要赋值了,只要是确定的,也是可行的。
    但是,网上也有人编译不通过,所以个人认为是和编译器以及支持哪种C标准有关(例如C99/C11/C90...),所以不必要纠结,最好还是不要将数组元素设置为变量,如果换个平台编译,可能就不行了,那么代码的移植性就很差了。

    
    // 验证数组元素是不是常量的情况
    
    #include<stdio.h>
    #include<stdlib.h>
    
    
    //-- 编译成功
    void test1()
    {
        int num = 10;        
        int a[num];        
    
        a[1] = 1;
        printf("a[1] = %d\n", a[1]);
    }
    
    /*
    //-- 编译失败
    void test2()
    {
        int num;
        int a[num];    
        num = 10;            
    
        a[1] = 2;
        printf("a[1] = %d\n", a[1]);
    }
    */
    
    //-- 编译成功
    void test3()
    {
        const int num = 10;        
        int a[num];        // 数组元素个数不是常量,编译报错
    
        a[1] = 3;
        printf("a[1] = %d\n", a[1]);
    }
    
    
    void element_tran(int num)
    {
        int a[num];
        a[1] = 4;
        printf("a[1] = %d\n", a[1]);
    }
    
    //-- 编译成功
    void test4()
    {
        element_tran(10);
    }
    
    
    void element_tran2(int num)
    {
        int a[num];
        a[1] = 5;
        printf("a[1] = %d\n", a[1]);
    }
    
    //-- 编译成功
    void test5()
    {
        int num;
        num = 10;
        
        element_tran2(num);
    }
    
    void main(int argc, const char *argv[])
    {
        int which_test = 1;
        if(argc > 1){
            which_test = atoi(argv[1]);
        }
        
        switch(which_test){
            case 1:
                test1();
                break;
            case 2:
                //test2();
                break;
            case 3:
                test3();
                break;
            case 4:
                test4();
                break;
            case 5:
                test5();
                break;
            default:
                break;
        }
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月24日
  • 已采纳回答 12月16日
  • 创建了问题 12月14日

悬赏问题

  • ¥20 keepalive配置业务服务双机单活的方法。业务服务一定是要双机单活的方式
  • ¥50 关于多次提交POST数据后,无法获取到POST数据参数的问题
  • ¥15 win10,这种情况怎么办
  • ¥15 如何在配置使用Prettier的VSCode中通过Better Align插件来对齐等式?(相关搜索:格式化)
  • ¥100 在连接内网VPN时,如何同时保持互联网连接
  • ¥15 MATLAB中使用parfor,矩阵Removal的有效索引在parfor循环中受限制
  • ¥20 Win 10 LTSC 1809版本如何无损提升到20H1版本
  • ¥50 win10 LTSC 虚拟键盘不弹出
  • ¥30 微信小程序请求失败,网页能正常带锁访问
  • ¥15 Matlab求解微分方程,如何用fish2d进行预优?