我擦,C/C++ 里支持 int a[n]; 这种写法了???

2013-11-15 17:44:50 +08:00
 xieranmaya
记得我上大学的时候这么个写法是不行的啊
C里要用malloc
C++里要用new
为毛现在可以这么写啊?是新标准的缘故?
大家可以拿这个代码在SOJ.ME上去测http://soj.me/1134这个题目
看while下面的两行代码

#include <stdio.h>
#include <stdlib.h>

void main() {
int n,s;
int i = 0;
int j = 1;
int t = 1;
int flag = 1;

while(scanf("%d%d",&n,&s) && n != 0){
int a[n];
int b[n];
for(i=0; i<n; i++){
scanf("%d%d", &a[i], &b[i]);
}

for(i=0; i<n; i++){
for(j=i+1; j<n; j++){
if(b[i] >= b[j]){
t = b[i];
b[i] = b[j];
b[j] = t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}

for(j=0; j<n; j++){
if(s < b[j]){
flag = 0;
break;
}
s = s+a[j];
}
if(flag == 0){
printf("NO\n");
}else{
printf("YES\n");
}
}
exit(0);
}
4611 次点击
所在节点    程序员
21 条回复
ritksm
2013-11-15 17:47:32 +08:00
C99标准引入的- -老早的事情了...
lotem
2013-11-15 17:48:43 +08:00
c99 variable-length arrays
txx
2013-11-15 17:52:15 +08:00
很早的事情了 就是编译的时候丢栈顶....不推荐的做法...
xieranmaya
2013-11-15 17:52:40 +08:00
@ritksm 啊,真是这样吗,尼马我上大学时都07年了老师也没告诉我可以这么写啊啊啊啊
txx
2013-11-15 17:53:36 +08:00
发现楼主是 大山中学的?
xieranmaya
2013-11-15 17:54:46 +08:00
@txx 说话能说一下这个是怎么实现的吗,会不会是编译前给重写成了
int *a;
a = malloc(...);
这样?
xieranmaya
2013-11-15 18:00:10 +08:00
@txx 不是我,是我妹子
skydiver
2013-11-15 18:02:10 +08:00
@xieranmaya malloc是堆上分配的空间吧。应该不一样
txx
2013-11-15 18:03:45 +08:00
不不不不不
它实际上还是使用的栈空间而不是堆空间...malloc 走的是堆空间..
他编译的时候 就把这个变量丢到栈顶.. 然后根据n是多少 划掉相应的空间
如果n过大直接 stackoverflow 而且对于一般程序而言 栈空间远远小于堆空间的

所以不推荐这个做法


http://stackoverflow.com/questions/448844/variable-sized-arrays-in-c
xieranmaya
2013-11-15 18:05:16 +08:00
@txx 高手哇~~解惑了~~
xdeng
2013-11-15 18:10:27 +08:00
malloc 和 new

malloc 只管分配内存
xdeng
2013-11-15 18:11:48 +08:00
不小心 按回车了 new 不单只分配内存 如果是对象还会调用 构造函数 而 malloc一个对象 不会。。。同理 delect 和 free 也不一样。。。
xieranmaya
2013-11-15 18:17:24 +08:00
@xdeng 嗯嗯,new 和 malloc 是有区别的~
Golevka
2013-11-15 18:53:46 +08:00
C99有VLA, C++14才把VLA正式纳入标准, 但是许多支持C++11的编译器都支持VLA作为自己的扩展特性.
Ricepig
2013-11-16 01:20:08 +08:00
lz大学还在用turbo c吗?哈哈
Ricepig
2013-11-16 01:21:04 +08:00
另外,小心stack overflow,这不是那个网站哦
treo
2013-11-16 17:39:49 +08:00
ms的vs至今不支持vla
guchy2012
2013-11-16 20:29:19 +08:00
C++里面把n设置为常量就可以这么用,而且是编译器行为。
xieranmaya
2013-11-18 11:09:15 +08:00
@Ricepig 当年上大学的时候用的是VC6.0.。。。
yegle
2013-11-18 13:07:35 +08:00
@txx 为什么是不推荐做法?有什么陷阱吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/89431

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX