鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖

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

[复制链接]
发表于 2015-4-7 21:49:43 | 显示全部楼层
原题为:
#include<stdio.h>      
void main()
{
        int *p, i, a[10];

        p = a;

        for( i=0; i < 10; i++ )
        {
                scanf("%d", p++);
        }

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

这里的第一个遍历之后指针p已经指向了&a[9],所以在第二次遍历中打印的是a[9]+9个未知乱码。。
只需把第一次遍历的p++改为p+i即可。。循环赋值之后p仍指向&a[0].
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2015-4-8 15:47:37 | 显示全部楼层
运行完了,表示结果正确呀。
p++表示指针p移到数组a的下一个元素处,而不是下一个地址。
输出了下地址,p跟p++的值相差4,即一个int型数组元素占4个字节。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-21 19:11:43 | 显示全部楼层
21楼正解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-24 12:55:56 | 显示全部楼层
p=a;的时候,p里的地址确实与数组指针的地址一样,但是因为定义的指针不是连续的,而数组指针是连续的,虽然p++了,但是没有让a+i与p+i相等,所以p++之后,p成为了野指针?是这个意思吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-25 15:52:51 | 显示全部楼层
你逐步调试,注意p,即指针指向的地址,,对比前后p值得区别,你会发现地址其实是错的。指针变量的指向地址一当改动就改动,就像全局变量一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-25 15:54:07 | 显示全部楼层
在每个for语句前加p=a;就OK了,不信试一下,我也是改了一个多钟才发现的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-14 12:22:03 | 显示全部楼层
21L正解,楼主的题我复制粘贴运行正常。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 05:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表