声明一个数组,由用户输入数组长度。不赋初值不报错,赋初值就报错?为什么

基本上,代码如下:

#include<stdio.h> 

int main(){
  int num = 0;
    printf("输入数组长度:");
    scanf("%d",&num);
    int arr[num]; //编译不报错
    //int arr[num] = {0};//编译报错
    return 0;
}

你什么编译器
int arr[num],这种声明不行,必须是常量num

int arr[num] = {0},这个报错,也是num必须为常量,并且不能分配0个大小元素的数组,num初始是0,

因为C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量。
这个简单例子:http://c.biancheng.net/cpp/html/2748.html

C语言中的数组大小是固定的,定义的时候不能是变量

想法很好,但是不支持这样写int arr[num]

C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量。

你可以先#define num 20
然后再从键盘键入一个数。当然了不能比这个20大

一般来讲,不能这么做的,必须指定数组的大小。但是测试中发现,堆栈中的数组大小,的确是在运行的时候确定的。

数组不能用变量啊,只能是常量

数组不能用变量啊,只能是常量

为什么赋值会报错呢,因为编译的时候编译器只知道你申请的是num(0)个啊,而你输入的时候那是运行时,编译器在编译的时候会有检查,结果发现你给没有的东西赋值初始化(0个嘛),肯定报错了。你把int初始化为1应该就不会错了
想想我上学那时候也是这么写错,哈哈。想我需要用到几个就申请几个,其实你不必要那么节约的,很多时候如果是用基本的数据类型来解决问题的话都是会有冗余。如果用到数组,你先多申请点用吧,没必要因为这个小细节去浪费学习其他知识的机会

#include

int main(){
int num = 0;
printf("输入数组长度:");
scanf("%d",&num);
int arr[num]; //编译不报错
//int arr[num] = {0};//编译报错
return 0;
}
int arr[num],这种声明不行,必须是常量num
int arr[num] = {0},这个报错,也是num必须为常量,并且你的num初始是0,所以不能分配0个大小元素的数组,

c语言环境

报错应该是不确定num的大小吧,万一输入num=0呢?

你两个定义都不行,数组定义的时候必须是常量不能是变量。要想做到内存在程序运行时任意分配就不能用数组,可以用链表