| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5874 人关注过本帖, 4 人收藏
标题:有个疑惑待解
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这个是简单得不能再简单的问题,论坛上多人多次反复反映过不能编译的现象,解释为什么编译不过的帖子很容易搜到,还在这里死撑能通过。能让它通过的编译器必定是垃圾编译器!

自认是新手,就不要学人牛逼哄哄地,本来可以完全不搭理你,让你困惑到底。

[ 本帖最后由 TonyDeng 于 2012-11-2 20:23 编辑 ]

授人以渔,不授人以鱼。
2012-11-02 20:20
J1036014410
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2012-11-2
收藏
得分:0 
回复 21楼 TonyDeng
恩,好吧,在这里gcc确实有问题,谢谢大手了,我能力确实还不够.受教了!
2012-11-02 20:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
未必是gcc有问题,可能是你把编译器的编译参数调整到很低,gcc不至于差到这个程度。一定是你某个地方有问题!

授人以渔,不授人以鱼。
2012-11-02 20:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不谈这个,就说你1楼的程序。假设你编译成功,真的执行了下面那个结果,那么可以尝试一下如下的测试办法:还是输入n=4,但是下面的循环语句把终结条件改大一点,到10以上,看能不能继续输入,如果能够,就说明这个4是不起作用的,那是C没有进行越界检查的结果。

[ 本帖最后由 TonyDeng 于 2012-11-2 20:55 编辑 ]

授人以渔,不授人以鱼。
2012-11-02 20:51
J1036014410
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2012-11-2
收藏
得分:0 
回复 23楼 TonyDeng
我之后又用gdb调试了一下,也是正常的,但愿是我自己的问题,呵呵
2012-11-02 20:53
hkexiao
Rank: 1
等 级:新手上路
帖 子:3
专家分:1
注 册:2011-12-26
收藏
得分:1 
肯定不行啊,看看malloc()和realloc()这两个函数吧,对你有用
2012-11-02 22:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
刚才查了一下,你使用的应该是添加了C99编译开关的C编译器模式。在新的C99标准中,确实有允许你1楼代码那样的使用的方式,但有严格要求,即这个数组必须是局部作用域的,也就是说,它跟普通数组一样,是在栈中分配内存,只不过尺寸在运行时获得n后,把数组的指针尺寸作了相应的偏移(这要求实际的栈剩余足以满足分配要求,而且不能被背别的数据占据了扩展空间)。在C++编译器中,是没有这种用法的,我上面使用的正是C++编译器,所以即使是微软的VS2012也报错(我没试过用C模式,估计也没多少人有C++编译器不用而非要回归C编译器,哪怕是C程序)。C99的这种数组,他们称之为VLA。

C++支持的类似模式,也是char a[n],不过要求在发现这条语句之前,编译器能够计算得到n的确定大小,是在编译时确定的,不能在运行时确定。VLA放松了,能够用你1楼那样的方式在运行时再分配数组大小,一旦确定,就不能再更改,终归还是普通的数组。这种用法,限制多多,其实是鸡肋,没多大用处。毕竟栈的空间有限,而且假如函数使用变量的情况复杂,比如有多个类似这样的数组,到底在实现时如何确保每个VLA都可以满足需求,那就难说了,假如这是在递归环境中呢?据查到的信息,有人说这是GCC编译器的非标准扩展,在很早以前也有,那就不清楚了。但无论如何,测试结果如此,说明这种代码没多少可移植性,不用也罢。其实,在C中使用堆的功能很强大,用不着在栈中玩这种把戏,微软就算不支持这种东西,也是有道理的。

[ 本帖最后由 TonyDeng 于 2012-11-3 01:10 编辑 ]

授人以渔,不授人以鱼。
2012-11-03 01:02
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:1 
TonyDeng,你的无知与不知羞耻已经到了让我无语的程度。

出差中,不喜欢拿手机发帖。先置顶,等我回去再好好点评你那些无知的言论。

在我开骂前的这段时间你最好再做做功课

重剑无锋,大巧不工
2012-11-03 03:14
StarFall
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:193
专家分:553
注 册:2012-10-1
收藏
得分:1 
等会在windows下试试。 当时我只是把这句话记住... 没想过实验。

去追寻更高的技术领域。永不停止。
2012-11-03 06:12
cyhdahua
Rank: 7Rank: 7Rank: 7
来 自:山东
等 级:黑侠
威 望:2
帖 子:221
专家分:643
注 册:2012-6-15
收藏
得分:1 
标记了   继续学~~

WE GO
2012-11-03 08:30
快速回复:有个疑惑待解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013166 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved