求助一个大家关于 C 语言 数组和指针 的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
drlalll
V2EX    C

求助一个大家关于 C 语言 数组和指针 的问题

  •  
  •   drlalll 2017-02-22 09:52:07 +08:00 3067 次点击
    这是一个创建于 3159 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本题出自 C Primer Plus


    #include<stdio.h> #define SIZE 10 int sump(int *start,int *stop); int main(void) { int marbless[SIZE] = {20,10,5,39,4,16,19,26,31,20}; long answer; answer = sump(marbless,marbless+SIZE); pintf("%d",answer); return 0; } int sump(int *start,int *stop) { printf("*start = %d\n",*start); printf("*stop = %d\n",*stop); int total = 0; while(start < stop) { printf("start = %d\n",start); printf("stop = %d\n",stop); printf("*start = %d\n",*start); printf("*stop = %d\n",*stop); total += *start; start++; } return total; } 

    添加 printf 后各输出如下:

    *start = 20 *stop = 1 start = 6684192 stop = 6684232 *start = 20 *stop = 1 start = 6684196 stop = 6684232 *start = 10 *stop = 1 start = 6684200 stop = 6684232 .... 190 

    不明白的就是为什么 *stop 的值会是 1 ?? 不是 marbles + SIZE 吗?? 求解!!

    19 条回复    2017-02-22 14:06:52 +08:00
    drlalll
        1
    drlalll  
    OP
       2017-02-22 09:57:22 +08:00
    不是很明白 *stop 的指针地址的值, marbles [0] 的值为 0 那么 marbles [0] + 10 //size 的值 应该是 marbles [0+10] 才对吧???
    whatTheGhost
        2
    whatTheGhost  
       2017-02-22 09:58:21 +08:00
    marbless 是一个 int 型指针,比如 marbless 指向的地址是 0 , marbless++后地址就变成了 4 。
    whatTheGhost
        3
    whatTheGhost  
       2017-02-22 10:02:00 +08:00   1
    marbless+SIZE-1
    drlalll
        4
    drlalll  
    OP
       2017-02-22 10:05:06 +08:00
    @whatTheGhost 这个我明白,比较不懂的是 marbles [0] 的值是 20 , marbles + SIZE 的值竟然是 1 ( SIZE 是 10 ),我的理解是 marbles + SIZE = marbles [10] ,但是 marbles 数组最大只有 marbles [9] , marbles [10] 应该是一个内存中之前存储的随机数,不知道这样理解对不对。
    MrLin
        5
    MrLin  
       2017-02-22 10:06:33 +08:00
    正解, marbless+SIZE = marbles[10]
    MrLin
        6
    MrLin  
       2017-02-22 10:07:11 +08:00   1
    是这个 marbless+SIZE = & marbles[10]
    wevsty
        7
    wevsty  
       2017-02-22 10:07:57 +08:00   1
    你首先得明白 marbles + SIZE 是个什么东西。
    marbles 是个数组,当成地址用的时候是指向首地址,也就是指向元素 marbles[0].
    marbles 一共有 10 个元素,所以最后一个元素是 marbles[9],用指针表示也就是 marbles+9.
    本例中 SIZE 是 10 , marbles+10 是一个未知的空间,里面是什么东西是完全未知的,典型的内存访问越界。
    drlalll
        8
    drlalll  
    OP
       2017-02-22 10:10:00 +08:00
    @wevsty 谢谢
    fliar
        9
    fliar  
       2017-02-22 10:10:53 +08:00   1
    *stop 值应该不确定吧
    VS2008 debug:
    *start = 20
    *stop = -858993460
    start = 3733460
    stop = 3733500
    *start = 20
    *stop = -858993460
    start = 3733464
    stop = 3733500
    *start = 10
    *stop = -858993460
    start = 3733468
    stop = 3733500
    *start = 5
    *stop = -858993460
    start = 3733472
    stop = 3733500
    *start = 39
    *stop = -858993460
    kingddc314
        10
    kingddc314  
       2017-02-22 10:36:22 +08:00 via iPhone
    数组访问越界了
    congeec
        11
    congeec  
       2017-02-22 10:53:00 +08:00
    其他语言写多了,已经不习惯 C 语言数组访问越界不报错了
    drlalll
        12
    drlalll  
    OP
       2017-02-22 12:24:02 +08:00
    谢谢大家,已经弄明白了!!
    oska874
        13
    oska874  
       2017-02-22 12:28:58 +08:00
    都数组越界了。。。。
    maplerecall
        14
    maplerecall  
       2017-02-22 12:49:01 +08:00 via Android
    的确越界了,不过功能上应该一般情况下是没问题的,虽然输出了*stop 不过实际上根本没用到啊,最终目的只是为了计算数组数字的和……
    woai110120130
        15
    woai110120130  
       2017-02-22 12:53:49 +08:00
    stop 数组已经越界,指针是个野指针,并且 stop 应该是 marbles + SIZE   *stop=marbless[SIZE](越界)
    hackpro
        16
    hackpro  
       2017-02-22 13:39:42 +08:00
    ASSERT(start == begin(marbless));
    ASSERT(stop == end(marbless));
    weiping1992
        17
    weiping1992  
       2017-02-22 13:46:45 +08:00
    好久不写 C 了,但是数组越界还是能看得出来的啊哈哈哈
    lzhCoooder
        18
    lzhCoooder  
       2017-02-22 13:55:24 +08:00
    UB 凑巧是 1 而已
    mainzo
        19
    mainzo  
       2017-02-22 14:06:52 +08:00 via iPhone
    调试器调试一下,看一下 marbless 数组的内存数据分布就知道怎么回事了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6178 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 01:57 PVG 09:57 LAX 18:57 JFK 21:57
    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