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