boot 发表于 2017-10-1 19:49:15

指针,一个不容易发现的错误

本帖最后由 boot 于 2017-10-1 19:52 编辑

小甲鱼老师讲过,下面这个是错误的,许多人的答案是在第二个for语句进行指针*p的初始化。
#include "stdio.h"

int main()
{
        int *p, i, a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

        for(i = 0; i < 10; i++)
        {
                p = &a;
                p++;
        }

        for(i = 0; i < 10; i++, p++)
        {
                printf("a[%d] = %d\n", i, *p);
        }

        return 0;
}

但我又发现这个:我在第二个//for(i = 0; i < 10; i++)//这里我把p++去掉了,结果最后正常输出了数组里的元素
#include "stdio.h"

int main()
{
        int *p, i, a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

        for(i = 0; i < 10; i++)
        {
                p = &a;
                p++;
        }

        for(i = 0; i < 10; i++)//这里我把p++去掉了,结果最后正常输出了数组里的元素
        {
                printf("a[%d] = %d\n", i, *p);
        }

        return 0;
}

boot 发表于 2017-10-1 19:50:07

求解,这是为什么???

ba21 发表于 2017-10-1 20:02:41



boot 发表于 2017-10-1 21:57:19

ba21 发表于 2017-10-1 20:02


嗯,谢谢你。
但我还想知道,就是为什么我那个会输出从0到9的数呢???{:10_254:}

ba21 发表于 2017-10-1 22:38:12

boot 发表于 2017-10-1 21:57
嗯,谢谢你。
但我还想知道,就是为什么我那个会输出从0到9的数呢???

拿下面代码运行分析下。至于什么问题,我只能说是编译器问题
#include "stdio.h"

int main()
{
      int *p, i, a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
                printf("%p\n\n", p);

      for(i = 0; i < 10; i++)
      {
                p = &a;
               
                                printf("%p\n", p);

                                p++;
      }

                printf("\n");

               printf("%p\n", p);

      for(i = 0; i < 10; i++)//这里我把p++去掉了,结果最后正常输出了数组里的元素
      {
                printf("a[%d] = %d\n", i, *p);
                                printf("%p\n", p);
      }

      return 0;
}

ravenhu13 发表于 2017-10-3 06:57:47

本帖最后由 ravenhu13 于 2017-10-3 07:06 编辑

楼主代码可以运行0至9??不明觉厉,第一眼看代码就觉得有问题,因为P的值是固定的,无论怎么打印*P都必须是同一个值,也就是你的循环打印*P这里不可能打印出不同的值,楼主你确定你没剪切错代码??
#include "stdio.h"

int main()
{
      int *p, i, a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

      for(i = 0; i < 10; i++)
      {
                p = &a;
                p++;
      }
/////////////////下面的这个P就没变过,怎么可能打印出不同的值??///////////////
      for(i = 0; i < 10; i++)//这里我把p++去掉了,结果最后正常输出了数组里的元素
      {
                printf("a[%d] = %d\n", i, *p);
      }

      return 0;
}

正确的代码应该如下:
int *p, i, a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//下面是个没有意义的循环,最终*P等于a(题目里的数组下标最多只到a),这就是经典的数组越界,这个时候引用*p将会产生不可预计后果。
                for (i = 0; i < 10; i++)
                {
                        p = &a;
                        p++;
                }
                //重新纠正p的地址。
                p = &a;

                for (i = 0; i < 10; i++,p++)
                {
                        printf("a[%d] = %d\n", i, *p);
                }

boot 发表于 2017-10-3 16:17:02

ravenhu13 发表于 2017-10-3 06:57
楼主代码可以运行0至9??不明觉厉,第一眼看代码就觉得有问题,因为P的值是固定的,无论怎么打印*P都必须 ...

谢谢了,我之前那个代码运行之后就是那样的,可能是编译器的问题吧。我当时也是这么想的已经越界了,没想到会是这个样子呢{:10_245:}

林01 发表于 2020-3-29 19:01:34

对啊,为什么啊,当i等于不同值的时候p不都时会有对应的地址么,为什么第一个循环结束后p的地址一定是&a+4

Mr.鹿 发表于 2021-3-31 12:09:14

林01 发表于 2020-3-29 19:01
对啊,为什么啊,当i等于不同值的时候p不都时会有对应的地址么,为什么第一个循环结束后p的地址一定是&a ...

因为越界了啊。因为你a实际上从a开始只到a啊,他第一个for循环,直接给干到a了,最多是a,那a自然是最大位数a往后4个字节啊。而且应该不出意外是一串奇怪的数字。
页: [1]
查看完整版本: 指针,一个不容易发现的错误