问题描述

在数组定义的时候,括号中定义数组长度使用的是整形变量,在dev c++和codeblocks上编译后,没有显示语法错误。但是在普通的oj提交平台上测试后显示语法错误。

int n;

scanf("%d",&n);

int a[n];

上面的代码原意是想创建一个动态数组,输入的n有多少,数组的长度就有多长。

原因分析:

C语言中数组定义长度的时候只能用整形常量,不能用整形变量。

原因在于c语言中所有变量空间都是在程序运行之初向系统申请的,包括指针、数组(除了一些动态申请方式如malloc函数),没有申请的空间系统是不允许读写的。也就是说,在程序运行之初,输入操作之前,定义的数组就先要向系统申请自身大小的空间,如果此时数组的大小是变量定义的,则变量的数值不能确定,则不能确定数组大小,也就无法申请,故不允许。

而在dev c++等编译软件上运行上面的代码,不报错是因为这些编译器的容错性很强。

例如:

如果把代码上面的代码改成下面的形式,在dev c++编译器中就会出错。

int n;

scanf("%d",&n);

int a[n]={3,4.5};


解决方案:

C语言要想实现动态数组,就只能通过malloc函数动态分配空间

将        int a[n];

给成     int* a=(int *)malloc(sizeof(int)*n);

malloc函数的使用方法:

malloc()函数返回的是所申请空间的头地址,malloc()中的参数为所申请空间字节大小,书写格式为sizeof(单独一个申请空间的类型)*【申请个数】

C语言 数组在定义时长度不能用变量相关推荐

  1. C语言-数组的定义和引用

    数组的定义和引用 1. 一维数组.二维数组的定义.初始化和引用方法 数组数据的特点: 数组: 一般形式:类型说明符 数组名[常量表达式]: 说明: 一维数组的引用 1. 引用方式: 二维数组 二维数组 ...

  2. c语言中数组的概念及作用,C语言数组的定义及其使用方法

    什么是数组? 在我们学习数组前先让我们介绍一下c语言中数组是什么?数组就是一个个元素按照一定顺序排列的集合.它将数据从最低的内存地址保存到最高的内存地址. 声明一个数组 c语言规定了声明数组的格式: ...

  3. c#数组赋初值_c语言数组的定义及赋值

    一维数组的定义方式如下:类型说明符 数组名[常量表达式]; 例如:int a[5]; 它表示定义了一个整型数组,数组名为 a,定义的数组称为数组 a. 此时数组 a 中有 5 个元素,每个元素都是 i ...

  4. c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

  5. C#二维数组的定义与长度获取

    这里说两种情况. 第一种情况: 数组定义: int[,] ids = new int[5,8]; //这种方法得到的是一个5*8的矩阵 长度获取: //获取一维数组的长度 int lenA = ids ...

  6. JS 二维数组的定义及长度判断

    动态定义二维数组: 1.先定义一维: var arr = new Array(); 2.定义二维: arr[0] = new Array(); arr[1] = new Array(); 3.给数组赋 ...

  7. C语言数组 :用户输入一个数, 我要用这个数当数组的长度。怎么办呢

    C语言不支持动态数组,也就是说,数组在定义时就要指定长度,把输入数作为它的长度那就说明定义时没有指定长度,这是不合法的. 使用 指针+动态分配malloc int* p;int n;scanf(&qu ...

  8. c语言如何定义比较大的数组_C语言:数据结构-数组的定义、逻辑结构和特点

    一维数组 (1)定义 一维数组是属于同一种数据类型的元素(变量)的有限序列,其元素称为数组元素,每个元素有统一的名称(数组名),有按序编号的唯一的下标.序列中元素的个数称为数组的长度. 例:a=a0, ...

  9. 舍友打了几把英雄联盟,C语言数组归纳(一)就被完成了

    文章目录 前言 正文 一.数组的引出及介绍 二.数组的分类 1.按维数 2.按元素类型 三.一维数组 1.一维数组的定义和初始化 1.一维数组定义格式: 2.一维数组初始化 2.一维数组元素的使用 1 ...

最新文章

  1. 基于激光点云语义信息的闭环检测
  2. 从hook007学习dll劫持自启动方式
  3. springcloud上传文件_Spring Cloud实战:服务链路追踪Spring Cloud Sleuth
  4. eclipse总跳出password required的框解决办法
  5. mysql+地图网格数据下载_echarts 中国各省市 echarts地图数据,含世界地图
  6. php.ini在哪里 微赞_虚拟主机php.ini在哪?怎么查看php.ini在哪
  7. (记录合并)union和union all的区别
  8. 基于Windows字库的点阵数据提取方法
  9. android studio for android learning (十七) Toast使用详解
  10. 百度文库收费文档下载方法
  11. win10打开计算机黑屏怎么办,win10系统开机就一直黑屏无法进入桌面的解决方法...
  12. 数学建模之排队论模型及代码
  13. Win7 蓝牙耳机无法使用
  14. Hadoop 十年解读与发展预测(插图+排版)
  15. ES(elasticsearch)测试数据
  16. ios9企业证书提示“未受信任的企业级开发者”解决方法
  17. 山东大学项目实训开发日志——基于vue+springboot的医院耗材管理系统(4)
  18. C语言笔记 隐藏光标函数 带注释(详细)
  19. 前端面试题之浏览器原理篇
  20. 什么是DML与DDL

热门文章

  1. Android HIDL机制学习
  2. 2023年最新水果DAW编曲软件fl studio21 macOS - 21.0.3.3036简体中文版免费下载支持苹果M1/M2处理器
  3. OneAlert携手钉钉快速构建IT运维on-call机制
  4. C#---面向对象(3)
  5. 【华为机试真题Java】报数游戏
  6. re.match()正则表达式
  7. GD32 寄存器操作按键点灯(裸机开发)
  8. 阿里云短信服务API怎么调用
  9. linux安装宝塔一半挂了怎么再继续,宝塔安装到一半,连接断开了
  10. 技术总监Sycx的故事