首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在声明可变大小的C数组时,我没有收到编译错误?

在C语言中,声明可变大小的数组时,需要在编译时知道数组的大小。如果在声明数组时没有收到编译错误,可能是因为以下原因:

  1. 数组大小已经在编译时确定。例如:
代码语言:c
复制
int arr[10];

在这种情况下,数组的大小在编译时就已经确定,因此不会出现编译错误。

  1. 数组大小是通过宏定义或常量定义的。例如:
代码语言:c
复制
#define ARRAY_SIZE 10
int arr[ARRAY_SIZE];

在这种情况下,数组的大小是通过宏定义或常量定义的,因此在编译时也是已知的,不会出现编译错误。

  1. 数组大小是通过变量定义的。例如:
代码语言:c
复制
int size = 10;
int arr[size];

在C99标准之后,可以使用变量来定义数组的大小。在这种情况下,如果没有收到编译错误,可能是因为编译器支持C99或更高版本的标准,并且在编译时确定了数组的大小。

如果在声明可变大小的数组时,仍然没有收到编译错误,但是在运行时出现了错误,可能是因为数组的大小在编译时未知,而在运行时才确定。在这种情况下,可以考虑使用动态内存分配来分配数组的内存空间,例如:

代码语言:c
复制
int *arr;
int size = 10;
arr = (int*)malloc(size * sizeof(int));

在这种情况下,数组的大小是在运行时确定的,因此需要使用动态内存分配来分配数组的内存空间。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

跟我学 Solidity :引用变量

要提醒你,从内存中读取或写入一个字(32 个字节)会消耗 3 gas,这就是为什么建议使用bytes而不是byte[]原因。 string 字符串是 UTF-8 数据动态数组。...对于constant,该值必须在编译确定,而对于immutable,则是构造赋值。 编译器不会为这些变量保留一个存储槽,而是每次出现时会由相应值替换。...常量使用关键字constant声明: uint256 constant maxParticipants = 10; 对于不可变状态变量,使用关键字immutable声明它们: contract C {...下一步是创建 Crud 函数,但是由于我没有向你介绍 Solidity 函数,因此将为你提供声明函数语法。...3. update 可见性:public 状态可变性:空 此函数将获取用户 ID 和新名称,然后找到相应用户对其进行更新,如果该用户不存在,则回退该交易。

1.7K30

多年老c++程序员静态数组这里翻船了

事情起因 事情是这样子滴,有一次代码评审时候,发现有同事想使用运行时才能够获取到值,去改变一个静态数组元素个数,当时就很诧异,因为心里知道这样是不可行,静态数组元素个数在编译就需要是固定不变...编译后执行显示如下: please input a num:10000 arr's size is 10000 不仅编译通过了,而且数组大小还在运行时修改了,可是明明定义是一个静态数组呀,而且就算这里不给...main()’: test.cpp:15: 错误可变大小对象 ‘arr’ 不能被初始化 所以很显然,记忆没有错误,之前静态数组元素个数它就必须是个不可变,否则编译就会出错。...然后去cppreference把c++11新特性从头到尾翻了一遍,并没有对这个修改有说明,并且网上搜索,所有的文章都在说cc++想使用变长数组,就必须要使用动态数组一度陷入了僵局,但是没有死心...移除隐式函数声明和隐式 int 看看,是不是明确说明了新特性是变长度数组,并且是c语言99年标准,有点灯下黑了,以后如果再看到有人说c语言和c++静态数组都只支持固定长度,要想变长就必须要使用malloc

35020

一个printf(结构体指针)引发血案

为什么写这篇文章 在上周六,公众号里发了一篇文章:C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻,以直白语言、一目了然图片来解释指针底层逻辑,有一位小伙伴对文中代码进行测试,发现一个比较奇怪问题...所以,测试如果输出结果与预期有一些出入,先检查一下编译器。C 语言本质上都是一些标准,每家编译器都是标准实现者,只要结果满足标准即可,至于实现过程、代码执行效率就各显神通了。...编译、执行,输出结果: ? 输出结果与之前错误一样,至此可以得出结论:问题原因至少与数组没有关系!...但是还是有点不死心,既然是未定义行为,那么为什么每次打印输出结果都错这么一致呢?既然是由编译实现决定,那么使用这个 gcc 版本内部是怎么来打印结构体变量呢?...但是事情好像还没有结束,我们都知道:调用系统中 printf 语句,传入参数个数和类型不是固定,那么 printf 中是如何来动态侦测参数个数和类型呢?

84320

Effective-java-读书笔记之泛型

比如List.class.使用instanceOf时候: 比如o instanceOf Set.第27条 消除非受检警告用泛型编程, 有可能会收到很多编译器警告, 要尽可能地消除每一个非受检警告.有一些根据提示即可消除...并加上注释解释为什么是安全.如果无法保证安全, 编译禁止了警告, 运行时还是会抛出ClassCastException.如果明知道安全却不做处理, 没有加Suppress注解, 那么当新出现一条可能有问题警告.... -> Sub[]是Super[]子类型.泛型是不可变(invariant). -> List和List没有子类型关系.所以有些类型错误问题用数组可能要在运行时才能发现...擦除就是使泛型可以与没有使用泛型代码随意进行互用.基于上述这些根本区别, 因此数组和泛型不能很好地混合使用.当你得到泛型数组创建错误时, 最好解决办法通常是优先使用集合类型List, 而不是数组类型...把一个值保存在泛型可变参数数列中是不安全.那么为什么声明泛型数组是非法, 而这种泛型可变参数声明是合法呢?

41860

C语言】 C 语言 关键字分析 ( 属性关键字 | 常量关键字 | 结构体关键字 | 联合体关键字 | 枚举关键字 | 命名关键字 | 杂项关键字)

#include //使用auto修饰全局变量,编译直接报错,因为auto代表存储栈中, 全局变量存储全局区, 因此auto只能修饰局部变量, 这里出现错误, 直接注释掉. auto...: 1.代码 : #include //使用auto修饰全局变量,编译直接报错,因为auto代表存储栈中, 全局变量存储全局区, 因此auto只能修饰局部变量, 这里出现错误,...3.本质 : 使用 void 修饰 返回值 和 参数, 其本质就代表没有; void 类型大小C语言规范没有规定, C 语言中是没有 void 变量....stu; ---- (2) struct 结构体大小 空结构体占用内存大小 : 1.C规范定义 : C语言规范中没有定义空结构体大小,不同编译器有不同默认值0或者1字节; 2.代码示例 : #include...0,其变量大小为0,其地址错位1. ---- (3) struct 结构体实现柔性数组 柔性数组 : 1.普通数组 : 定义时候定义数组大小,并且栈上分配内存; 2.柔性数组 : 数组大小未知

2.3K20

第32项:谨慎地结合泛型和可变参数(Combine generics and varargs judiciously)

如果方法声明可变参数为不可具体化类型,则编译器会在声明上生成警告。如果调用一个包含可变参数方法,推断其可变参数类型是不可具体化,那么编译器也会对调用生成警告。...这个例子引出了一个有趣问题:为什么使用泛型可变参数声明方法是合法,而显示创建泛型数组是非法?换句话说,为什么前面显示方法只生成警告,而127页代码片段生成错误?...此数组类型由传递给方法参数在编译确定类型,编译器可能没有足够信息来进行准确的确定。因此方法返回其可变参数数组,所以它可以将堆污染传播到调用堆栈。    ...编译此方法编译器会生成代码来创建一个可变参数数组数组中将两个T实例传递给toArray。...你不必使用SafeVarargs注释来保证其安全性,并且你不必担心确定其安全性可能会犯错误。主要缺点是客户端代码有点冗长,执行起来可能会慢一点。

1.3K20

一个printf(结构体指针)引发血案

为什么写这篇文章 在上周六,公众号里发了一篇文章:C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻,以直白语言、一目了然图片来解释指针底层逻辑,有一位小伙伴对文中代码进行测试,发现一个比较奇怪问题...所以,测试如果输出结果与预期有一些出入,先检查一下编译器。C 语言本质上都是一些标准,每家编译器都是标准实现者,只要结果满足标准即可,至于实现过程、代码执行效率就各显神通了。...编译、执行,输出结果: ? 输出结果与之前错误一样,至此可以得出结论:问题原因至少与数组没有关系!...但是还是有点不死心,既然是未定义行为,那么为什么每次打印输出结果都错这么一致呢?既然是由编译实现决定,那么使用这个 gcc 版本内部是怎么来打印结构体变量呢?...但是事情好像还没有结束,我们都知道:调用系统中 printf 语句,传入参数个数和类型不是固定,那么 printf 中是如何来动态侦测参数个数和类型呢?

65820

27 个问题,告诉你Python为什么这么设计

C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是 Python 中没有局部变量声明,所以必须查找类定义才能确定。...C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们会很可惜。使用显式 self.var 很好地解决了这个问题。...如果在绑定到字符串名称上允许使用这些方法,则没有逻辑上理由使其文字上不可用。 第二个异议通常是这样:“实际上是告诉序列使用字符串常量将其成员连接在一起”。遗憾是并非如此。...这使得索引列表 a[i] 操作成本与列表大小或索引值无关。 当添加或插入项,将调整引用数组大小。...并采用了一些巧妙方法来提高重复添加项性能; 当数组必须增长,会分配一些额外空间,以便在接下来几次中不需要实际调整大小。 字典如何在CPython中实现?

6.6K11

快速学习-Solidity 深入理解

,与C语言类似,默认从0开始递增,一般用来模拟合约状态 函数(function):一种表示函数类型 Solidity引用类型 数组(Array) 数组可以声明时指定长度(定长数组),也可以动态调整大小...Locked, Inactive } } 数组(Array) 固定大小k和元素类型T数组被写为T [k],动态大小数组为T []。...c.compute(3, 5); // 错误:成员 `compute` 不可见 } } contract E is C { Solidity函数状态可变性 pure:纯函数,不允许修改或访问状态 view...调用任何没有标记为 view 或者 pure 函数。 使用低级调用。 使用包含特定操作码内联汇编。 Solidity函数状态可变性 以下被认为是从状态中进行读取: 读取状态变量。...;没有名字,不能有参数也不能有返回值 如果在一个到合约调用中,没有其他函数与给定函数标识符匹配(或没有提供调用数据),那么这个函数(fallback 函数)会被执行 每当合约收到以太币(没有任何数据

1.2K30

知识总结:C++工程师106道面试题总结(含答案详解)

其中可能有一些错误或者由于编译环境有差异请大家自动忽略这些错误【由于个人是搞ACM,所以关于算法方面的东西就没有怎么提供了,不过大家把数据结构刷一遍是必要】 信号生命周期?  ...一般在数组前面几个字节中存在某一个结构体来保存当前申请数组大小。  __stdcall和__cdecl区别?  ...为什么?那拷贝构造函数能不能为虚函数?为什么?   不可以为虚函数,因为调用构造函数,虚表指针并没有在对象内存空间中,必须要构造函数调用完成后才会形成虚表指针。   ...原因:多文件处理变为一个文件其实是通过链接器来实现,所以如果用源文件来处理模板实现,会导致链接失效,最主要原因还是在编译编译器会暂时不处理模板类只有实例化对象才去处理,但是这就需要实现代码了...使用extern “C”来产生C语言环境编译程序供外部使用。  Extern “C”是什么意思?他有什么作用?   表示当前声明需要用C语言环境进行编译。  进程间通信方式有哪些?

2.2K90

大厂面试经历(附100+面试题干货)

在这里提供一下自己复习东西吧,也就把这个东西给搞了一遍,然后面试基本没啥问题了,如果问很深的话,那就只能只求多福了兄弟!其中可能有一些错误或者由于编译环境有差异请大家自动忽略这些错误。...一般在数组前面几个字节中存在某一个结构体来保存当前申请数组大小。  11:__stdcall和__cdecl区别?  ...为什么?那拷贝构造函数能不能为虚函数?为什么?   不可以为虚函数,因为调用构造函数,虚表指针并没有在对象内存空间中,必须要构造函数调用完成后才会形成虚表指针。   ...原因:多文件处理变为一个文件其实是通过链接器来实现,所以如果用源文件来处理模板实现,会导致链接失效,最主要原因还是在编译编译器会暂时不处理模板类只有实例化对象才去处理,但是这就需要实现代码了...使用extern “C”来产生C语言环境编译程序供外部使用。  53:Extern “C”是什么意思?他有什么作用?   表示当前声明需要用C语言环境进行编译。  54:进程间通信方式有哪些?

1.3K20

细微之处见真章之StringUtilsisBlank函数细节解读

另外我们研究这个问题时候又有了新发现: 我们发现 overlay 函数在此次提交,将 StringBuilder 拼接字符串方式改为了直接用加号拼接,大家可以思考下为什么。...一个 final 变量,除非之前该变量是明确未被赋值,否则再次赋值会报编译错误。 一旦 final 变量被赋值,那么它就是始终保持同一个值。...2 局部变量声明时如果没有初始化,如果满足以下几种情况,则为 effectively final 没有声明为 final 当它出现在赋值表达式左边,它肯定是未赋值,而且赋值之前也没有明确赋值...存储字符数组 value 成员变量用 final 修饰,赋值后引用不能改变。 所有修改对象属性或状态方法返回都是新字符串对象。 因此我们编写不可变对象可以参考这种思路。...在这里更希望大家转向从 Java 语言和虚拟机层面来学习知识,而《Java 语言规范》和 《Java 虚拟机规范》则是官方出权威参考。 是什么?为什么?怎么做? 这是一个非常重要思维方式。

61720

27 个问题,告诉你Python为什么这么设计?

即使是经验丰富C程序员有时会长时间盯着它,想知道为什么即使 x > y , y 也减少。 因为没有开始/结束括号,所以Python不太容易发生编码式冲突。C中,括号可以放到许多不同位置。... C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是 Python 中没有局部变量声明,所以必须查找类定义才能确定。...C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们会很可惜。使用显式 self.var 很好地解决了这个问题。...如果在绑定到字符串名称上允许使用这些方法,则没有逻辑上理由使其文字上不可用。 第二个异议通常是这样:“实际上是告诉序列使用字符串常量将其成员连接在一起”。遗憾是并非如此。...这使得索引列表 a[i] 操作成本与列表大小或索引值无关。 当添加或插入项,将调整引用数组大小

3.1K20

Java基础八股文第一弹

Java是一个强类型语言,它允许扩展编译检查潜在类型不匹配问题功能。Java要求显式方法声明,它不支持C风格隐式声明。这些严格要求保证编译程序能捕捉调用错误,这就导致更可靠程序。...Java 通过虚拟机从而实现跨平台特性, C++ 依赖于特定平台。 Java 没有指针,它引用可以理解为安全指针,而 C++ 具有和 C 一样指针。...黑白双方负责接受用户输入,并告知棋盘系统棋子布局发生变化,棋盘系统接收到了棋子变化信息就负责屏幕上面显示出这种变化,同时利用规则系统来对棋局进行判定。 JKD和JRE区别?...String 为什么可变?...为什么是final? 线程安全。同一个字符串实例可以被多个线程共享,因为字符串不可变,本身就是线程安全。 支持hash映射和缓存。

93810

CC++刁钻问题各个击破之细说sizeof

原因是函数参数传递数组被转化成指针了,或许你要问为什么要转化成指针,原因可以很多书上找到,简单说一下:假如直接传递整个数组的话,那么必然涉及到数组元素拷贝(实参到形参拷贝),当数组非常大...通过特性3和特性4,我们看到了数组和指针有着千丝万缕关系,这些关系也是导致程序潜在错误一大因素,关于指针与数组关系问题将在《C/C++刁钻问题各个击破之指针与数组秘密》一文中进行详细介绍。...最开初c标准规定sizeof只能编译求值,后来c99又补充规定sizeof可以运行时求值。但值得注意是,即便是实现了c99标准DEV C++中仍然不能用sizeof求得动态分配内存大小!...这里不完整数组是指数组大小没有确定数组!...可是当我去验证编译器根本不让通过!这个是为什么呢?半会想不到,所以还请朋友们补充! 特性8:sizeof求得结构体(及其对象)大小并不等于各个数据成员对象大小之和!

77420

干货 | 27 个问题,告诉你 Python 为什么如此设计?

C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是 Python 中没有局部变量声明,所以必须查找类定义才能确定。...C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们会很可惜。使用显式 self.var 很好地解决了这个问题。...如果在绑定到字符串名称上允许使用这些方法,则没有逻辑上理由使其文字上不可用。 第二个异议通常是这样:“实际上是告诉序列使用字符串常量将其成员连接在一起”。遗憾是并非如此。...这使得索引列表 a[i] 操作成本与列表大小或索引值无关。 当添加或插入项,将调整引用数组大小。...并采用了一些巧妙方法来提高重复添加项性能; 当数组必须增长,会分配一些额外空间,以便在接下来几次中不需要实际调整大小。 19. 字典如何在 CPython 中实现?

2.6K20

lua学习笔记

所以,在编译或运行 Lua 代码块过程中,无论何时发生错误, 控制权都返回给宿主,由宿主负责采取恰当措施(比如打印错误消息)。 元表及元方法 Lua 中每个值都可以有一个 元表。...所有没有显式声明为局部变量变量名都被当做全局变量。 对全局变量 x 操作等价于操作 _ENV.x。 变量首次赋值之前,变量值均为 nil。...x 以及 f() 返回所有结果 a,b,c = f(), x -- f() 被调整为 1 个结果 (c 收到 nil) a,b = ... -- a 收到可变参数列表第一个参数..., -- b 收到第二个参数(如果可变参数列表中 -- 没有实际参数,a 和 b 都会收到 nil)...所有的 API 函数按相关类型以及常量都声明头文件 lua.h 中。 C 库中所有的 Lua API 函数都不去检查参数是否相容及有效。

91620

程序员C语言快速上手——基础篇(五)

需要注意,函数返回值和形式参数都是可选,当有返回值,必须配合return语句返回,当函数没有返回值,应当使用void关键字声明,注意措辞,是应当,而不是必须!...具体细节,在后续篇幅中会详细说明 简单函数小结 函数不能返回数组,因此函数返回值不能是数组类型。 函数没有返回值,也应当写上void明确返回值类型 C语言没有函数重载概念。...网上存在很多错误言论和资料,一定要明确,C语言中,数组不存在值传递,这也是为什么不能对做函数参数数组使用sizeof运算原因所在,因为它会自动退化为指针。...10,可是为什么函数外部打印t值,它没有发生改变呢?...什么是指针 回答什么是指针之前,认为应当先提问为什么需要指针?如果没有明确应当重视理由,大家何必花大力气学习它呢?

90020

干货 | 27 个问题,告诉你 Python 为什么如此设计?

C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是 Python 中没有局部变量声明,所以必须查找类定义才能确定。...C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们会很可惜。使用显式 self.var 很好地解决了这个问题。...如果在绑定到字符串名称上允许使用这些方法,则没有逻辑上理由使其文字上不可用。 第二个异议通常是这样:“实际上是告诉序列使用字符串常量将其成员连接在一起”。遗憾是并非如此。...这使得索引列表 a[i] 操作成本与列表大小或索引值无关。 当添加或插入项,将调整引用数组大小。...并采用了一些巧妙方法来提高重复添加项性能; 当数组必须增长,会分配一些额外空间,以便在接下来几次中不需要实际调整大小。 19. 字典如何在 CPython 中实现?

2.7K10

Python 核心设计理念27个问题及解答

C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是 Python 中没有局部变量声明,所以必须查找类定义才能确定。...C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们会很可惜。使用显式 self.var 很好地解决了这个问题。...如果在绑定到字符串名称上允许使用这些方法,则没有逻辑上理由使其文字上不可用。 第二个异议通常是这样:“实际上是告诉序列使用字符串常量将其成员连接在一起”。遗憾是并非如此。...这使得索引列表 a[i] 操作成本与列表大小或索引值无关。 当添加或插入项,将调整引用数组大小。...并采用了一些巧妙方法来提高重复添加项性能; 当数组必须增长,会分配一些额外空间,以便在接下来几次中不需要实际调整大小。 19. 字典如何在 CPython 中实现?

3.3K21
领券