请问 C 语言中,如果已经规定了数组长度,在初始化定义数组时会对其后的空间有影响吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Newyorkcity
V2EX    问与答

请问 C 语言中,如果已经规定了数组长度,在初始化定义数组时会对其后的空间有影响吗?

  •  
  •   Newyorkcity 2017 年 4 月 22 日 3040 次点击
    这是一个创建于 3233 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #include<stdio.h> int main(){ char arr[4] = {1,2,3,4}; int k=0; for(k;arr[k];k++){ printf("arr[k] = %d\t",arr[k]); printf("arr[k]地址为%p\n",arr+k); } while(1){ printf("arr[k] = %d\t",arr[k]); printf("arr[k]地址为%p\n",arr+k); k++; printf("getchar"); getchar(); } return 0; } 

    不论是重新编译运行还是关掉 dev-cpp 重新打开这个.c 文件再编译运行,输出的结果都是一样的,如下 不论如何在数组之后的空间里的都是这么个赋值,出现这么多 0 是为什么呢?理论上来说不应该是各个的值都不一样,乱七八糟的那种么?尤其是那个 12 ,不知道是怎么来的。
    并且 C 语言应该是不会在数组结束的时候像对待字符串那样顺手给放一个'\0'作为标识的吧?
    先说一声谢谢。
    13 条回复    2017-04-23 12:12:00 +08:00
    Cbdy
        1
    Cbdy  
       2017 年 4 月 23 日 via Android
    没有影响,第五行第一个 4 有无无异
    ghostheaven
        2
    ghostheaven  
       2017 年 4 月 23 日 via Android   1
    arr 应该在栈上,要看最后变量再栈上怎么分配的。那个 12 很可能就是变量 k 。
    geelaw
        3
    geelaw  
       2017 年 4 月 23 日 via iPhone
    你看到的确实是一坨乱七八糟的东西
    ghostheaven
        4
    ghostheaven  
       2017 年 4 月 23 日 via Android
    栈上没有用过的地方可能是随机的数据,但是用过的地方就是确定的,只要输入确定,编译器确定,没有随机数这种东西,那某个阶段栈的结构和数据都应该是确定的。
    lrxiao
        5
    lrxiao  
       2017 年 4 月 23 日
    ub 有啥可说的
    ghostheaven
        6
    ghostheaven  
       2017 年 4 月 23 日 via Android
    开个 vs 调试一下,看看汇编,应该就知道那个 12 是谁了。
    codingyue
        7
    codingyue  
       2017 年 4 月 23 日 via iPhone
    学习一下汇编吧。这样就懂这段代码到底做了啥
    geelaw
        8
    geelaw  
       2017 年 4 月 23 日 via iPhone
    @ghostheaven 编译器可以搞随机数哇
    ghostheaven
        9
    ghostheaven  
       2017 年 4 月 23 日 via Android
    @geelaw gcc 有 pie 和 pic ,可以随机分配变量地址,不过不清楚 vs 有没有
    geelaw
        10
    geelaw  
       2017 年 4 月 23 日
    @ghostheaven 我不是谈论编译器的具体实现,而是说 standard compliant 的编译器可以干什么
    ghostheaven
        11
    ghostheaven  
       2017 年 4 月 23 日 via Android
    @geelaw 不懂 standard compliant 是什么。编译器知识有限。
    billlee
        12
    billlee  
       2017 年 4 月 23 日
    数组越界是未定义行为,所谓未定义行为,就是编译器想干什么都可以
    deeporist
        13
    deeporist  
       2017 年 4 月 23 日   1
    for 的循环判断不好是"arr[k]"的吧 万一 arr[3]后面的空间里一直有东西你这不就死循环(+数组越界)了么 而且为什么非要“乱七八糟"呢? 太先入为主了吧 每次都一样? 你重启电脑再来一次看看 要是还一样 可能是程序运行前期动用过这些区域 (但按道理应该不会) 主要那块内存区域是划出来专门给你用的 系统的其他进程不碰那里的 0 多那是因为你把内存区域按 char 的长度来看了 一般 64 位系统也好 32 位系统也好能用上最高位的情况也不多的 最后的'\0' 需要手动加 编译器不会自己加的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1009 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 19:04 PVG 03:04 LAX 11:04 JFK 14:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86