- 主题:[讨论][求助]c++什么时候允许用变量定义数组的?为什么?
代码如下,编译正常;
int n;
cin >> n;
int arr[n];
什么时候允许这样的?古老的时候编译器会做检查,要求n必须是常量。
做了下测试,这个内存还分配在栈内存中,但n等于1KW的时候,就栈溢出了。而用new,完全不会溢出。
为什么要支持这样的特性?
--
修改:helloabc FROM 116.213.168.*
FROM 116.213.168.*
C的吧。部分C++编译器也支持C的这个东西。
栈上分配大尺寸的东西是找死。特别地,如果数组的尺寸是外部可控的,可以实现精准溢出,容易导致安全漏洞。
--
FROM 221.220.168.*
C支持吗?
这个我倒没了解过。
记得以前c++编辑器是编译不过去的。
【 在 z16166 的大作中提到: 】
: C的吧。部分C++编译器也支持C的这个东西。
: 栈上分配大尺寸的东西是找死。特别地,如果数组的尺寸是外部可控的,可以实现精准溢出,容易导致安全漏洞。
--
FROM 116.213.168.*
C99支持
C++标准没有
但gcc支持
--
FROM 113.200.85.*
这是不是很容易搞死机?
【 在 laser2000 的大作中提到: 】
: C99支持
: C++标准没有
: 但gcc支持
--
FROM 123.112.68.*
栈内存有限,这么搞很容易栈溢出。
想不通为什么要支持这个特性?
【 在 laser2000 的大作中提到: 】
: C99支持
: C++标准没有
: 但gcc支持
--
FROM 116.213.168.*
另外GCC是什么时候支持的?
以前没发现会支持这个。
【 在 laser2000 的大作中提到: 】
: C99支持
: C++标准没有
: 但gcc支持
--
FROM 116.213.168.*
小数组在栈上快
大数组必须分配在堆上
所以要用这个特性的话可以规定一个尺寸上限(kernel代码的话直接禁止使用),防止滥用成灾
【 在 helloabc 的大作中提到: 】
: 栈内存有限,这么搞很容易栈溢出。
: 想不通为什么要支持这个特性?
:
--
FROM 221.220.168.*
现代操作系统都工作在内存保护模式
大多数情况下,内存耗尽前都会先杀死程序
【 在 butian 的大作中提到: 】
: 这是不是很容易搞死机?
--
FROM 183.131.109.*
至少在gcc4.5以前吧,4.5在2010年发布,已经完整支持整个c99了。
【 在 helloabc 的大作中提到: 】
: 另外GCC是什么时候支持的?
: 以前没发现会支持这个。
:
--
FROM 222.129.48.*