C语言数组定义问题。

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

参考例程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;
    }
}