网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月28日漏签0天
c语言吧 关注:798,876贴子:4,357,598
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 32回复贴,共1页
<<返回c语言吧
>0< 加载中...

不懂,上边我有弄#define NUMBER 20 ,那个第8行,输num就搞不下

  • 只看楼主
  • 收藏

  • 回复
  • 恹花辞树
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这是改了num的运行结果,3号后面下不去了。
[ ]里改成NUMBER,倒有可以。什么原理???原理???原理???

这下边的图是正常改成NUMBER的代码和运行。


正常的运行结果↓


  • 恹花辞树
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
dd


2025-07-28 05:58:13
广告
不感兴趣
开通SVIP免广告
  • 恹花辞树
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我这个num的值是键盘上输入的。


  • GTA小鸡
  • 吧主
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第8行没有初始化num就使用了num的值,数组长度不可知


  • 恹花辞树
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
翻了下书,说是[ ]里的元素个数必须是常数。
那,为啥那个运行就到3就不动了。
错的代码里,我把num改为4,也是只运行到3号就不动了。
这是啥缘故???缘故?


  • 星尘喵
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你用一个变量初始化数组本身就是错的,更何况那个变量还没初始化。
先输入num,然后const int NUM=num;,然后再int fen[NUM];


  • 一介书生hgg
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我感觉这个贴吧的全是辣鸡


  • 一周休七日
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
int fun[num]时num是多少未知


2025-07-28 05:52:13
广告
不感兴趣
开通SVIP免广告
  • 卧槽灭绝了
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
emmm,C语言的数组维度应该不能从键盘输入(我已经混乱了,看见有人搞成功过,但是我还是觉得不能),如果要从键盘输入的话我一般用malloc来分配内存


  • 爱你一万年
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你上面才定义了num,下一行就定义num数值的断组?你觉得没问题?定义数组长度,只能用常数。


  • 贴吧用户_54U4eeb
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
数组定义时大小必须是确定的。
int *fen;
int num,max;
scanf("%d",&max);
fen=(int *)malloc(max*sizeof(int));
int i=0;
do
{scanf("%d",&num);
if(num<0||num>20)
printf("请输入0到20");
else {fen[i]=num;i++;}
}while(i<=max-1)


  • GAtties
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
用未初始化的变量定义变长数组的长度,这是未定义行为未定义行为的表现和编译器有关,比如我用的gcc直接一点输出都没程序就直接崩了


  • 无声的硝烟
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
1. fen[NUMBER]与fen[num]:
C语言是编译型语言,程序的编译过程中需要为变量分配 确定的 内存空间,因此标准C不支持使用 变量 作为初始化时下标的做法。
那么为什么fen[NUNBER]这样写是允许的呢?这个问题涉及到编译的一个阶段叫“预编译”。顾名思义,预编译是在编译之前的工作,它转化以#开头的行(引用、定义的宏等)。比如预编译阶段,NUMBER这6个字母会被替换为20,后续编译过程中看到的就只是int fen[20];(和你直接写int fen[20]效果完全相同,定义宏的目的是为了程序美观,后续方便修改和拓展)从始至终,NUMBER不是一个变量,仅仅是一个宏。
对于fen[20](预编译转换来的也一样),编译器会指明函数执行时,在栈上分配一个长度为20*int大小的空间;而fen[num]则不一样,编译器根本无法知道num在运行时的值,也就无法在编译时分配相应的大小。即便是程序的上一行明明白白写着int num=4,这个4也是运行时的值,编译时理论上并不会考虑到,仍然认为num是个变量,编译器才不管你前面是怎么赋值怎么计算的。因此,在标准C中这种写法是不被允许的,这也是编译型语言和解释型语言一个典型的区别。(解释型语言是边解释边运行,所以同样的情况是一定知道数组长度的)
但是,有些编译器的确会为这种特殊的写法做相应的语法和语义变通。虽然无法在编译时确定数组实际的长度,但是可以将其分配空间的位置从在栈上改为在堆上(你需要先了解一些操作系统和编译原理的知识),或者用预分配足够大空间等其他方法来实现。你的编译器没有报错,显然是做了相应修改的。


  • SwetTiger
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
C99之后可以用变量做数组参数了,但是你的编译器得支持


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 32回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示