V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
drlalll
V2EX  ›  C

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

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

    本题出自 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);
        printf("%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   ·   实用小工具   ·   1026 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:12 · PVG 07:12 · LAX 15:12 · JFK 18:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.