| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5874 人关注过本帖, 4 人收藏
标题:有个疑惑待解
只看楼主 加入收藏
J1036014410
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2012-11-2
结帖率:100%
收藏(4)
已结贴  问题点数:20 回复次数:90 
有个疑惑待解
本人新手。看很多c语言教程上说数组是不能动态赋值的,即以下形式是非法的:int n;scanf("%d",&n);int m[n]。
但是我实际编写时发现编译和运行都没问题,不知道是为什么。以下是我的实例:
#include<stdio.h>
void main()
{
    int n,i;
    printf("input:");
    scanf("%d",&n);
    int m[n];
    printf("inputs:");
    for(i=0;i<n;i++)
      scanf("%d",&m[i]);
    for(i=0;i<n;i++)
      printf("%4d",m[i]);
    printf("\n");
}
上面是源码,以下是编译和运行过程。注:本人是在linux系统下用gcc编译器。

loongson@LOonux:~$ gcc -g -o shuzu.o shuzu.c
loongson@LOonux:~$ ./shuzu.o
input:4
inputs:1 2 3 4
   1   2   3   4

没有任何问题!
搜索更多相关主题的帖子: include 编译器 动态 
2012-11-02 16:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 
gcc编译器居然能让你这个代码生成.exe执行文件,啧啧~

授人以渔,不授人以鱼。
2012-11-02 17:01
J1036014410
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2012-11-2
收藏
得分:0 
回复 2楼 TonyDeng
谁说是.exe文件了?明明就是那个shuzu.o文件。linux系统。
2012-11-02 17:22
xiaojimmyche
Rank: 1
等 级:新手上路
帖 子:19
专家分:8
注 册:2012-11-1
收藏
得分:1 
表示刚刚学c语言,不知道怎么回事~
2012-11-02 17:50
波心冷月
Rank: 1
等 级:新手上路
帖 子:8
专家分:5
注 册:2012-10-29
收藏
得分:1 
表示也疑惑
2012-11-02 18:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你执行得到后面那个画面,就已经获得.exe,还.o呢,连C的运行机制也不明白是吧。

授人以渔,不授人以鱼。
2012-11-02 19:06
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:1 
以下是引用TonyDeng在2012-11-2 19:06:13的发言:

你执行得到后面那个画面,就已经获得.exe,还.o呢,连C的运行机制也不明白是吧。
gcc的-o参数后面跟输出文件名 linux或者说*nix系统里面可执行文件从习惯上不用特殊的后缀 因为这个系统有一个判断文件类型的方法 而非windows那样根据后缀决定打开方式

这里可能是C99或者其他东西对数组的扩充 从堆栈的实现方法来说 动态大小没有任何困难 但为啥不实现呢 1 兼容性 2 速度 我觉得很多编译器不大乐意实现都是基于速度考虑的罢 因为C里面局部变量都是在堆栈上 而降低了堆栈的效率等于影响了整个C语言程序的效率 所以像神马动态 神马释放 支持情况都不大好
2012-11-02 19:19
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用J1036014410在2012-11-2 16:58:39的发言:

本人新手。看很多c语言教程上说数组是不能动态赋值的,即以下形式是非法的:int n;scanf("%d",&n);int m[n]。
但是我实际编写时发现编译和运行都没问题,不知道是为什么。以下是我的实例:
#include
void main()
{
    int n,i;
    printf("input:");
    scanf("%d",&n);
    int m[n];
    printf("inputs:");
    for(i=0;i
尽信书不如无书 语言最终是用编译器理解的 所以可以说一切以编译器为准 编译器手册都不一定靠谱 既然这里gcc支持 那就是支持 这也论证了书是不正确的 最起码这里是错的

类似的 实验可以推翻理论 但理论不能推翻实验
2012-11-02 19:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
能执行的都是机器码,任何操作系统都不靠文件扩展名来识别程序能否执行。gcc编译器能让这种代码编译通过,那么它只能是垃圾编译器!

授人以渔,不授人以鱼。
2012-11-02 19:24
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用TonyDeng在2012-11-2 19:24:17的发言:

能执行的都是机器码,任何操作系统都不靠文件扩展名来识别程序能否执行。gcc编译器能让这种代码编译通过,那么它只能是垃圾编译器!

gcc不要钱 光这一点就够了。。
2012-11-02 19:26
快速回复:有个疑惑待解
数据加载中...
 
   



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

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