指针,一个不容易发现的错误
#include <stdio.h>void main()
{
int *p,i,a;
p=a;
for(i=0;i<10;i++)
{
scanf("%d",p++);
}
printf("\n");
for(i=0;i<10;i++,p++)
{
printf("%d",*p);
}
}
请大家指出错误,谢谢
p只初始化了一次,输出时,i=0时 ,p的值已经是&a+4
所以 要先把p的值改回为&a
#include <stdio.h>
void main()
{
int *p,i,a;
p=a;
for(i=0;i<5;i++)
{
scanf("%d",p++);
}
p=a; printf("\n");
for(i=0;i<5;i++,p++)
{
printf("%d\n",*p);
}
}
人才!!!! :lol原来如此 .脑筋急转弯了 p的值改变了 表示很纠结 谢谢指导。。。。 在第二次调用printf是p的值已经超出了数组的范围了,要把p重新赋予a的值,就是在第二个printf前加个p=a; 我又有一个新问题、、
在单步调试的时候,我发现我按了找了一下*p的值和*p++的值。它的值好像不如scanf函数我们当前输入的值?
求解答为何会这样子 本帖最后由 #~帝王之焰~# 于 2013-1-5 19:38 编辑
#include <stdio.h>
void main()
{
int *p,i,a;
p=a;
for(i=0;i<10;i++)
{
scanf("%d",p++);
}
printf("\n");
for(i=0,p=a;i<10;i++,p++)
{
printf("%d",*p);
}
}
最后一次调用已超出数组范围,系统将分配任意一块内存~~于是最后的值将是不可预料的值~~ 指针越界了 #include <stdio.h>
int main()
{
int *p,i,a={
};
p=a;
for(i=0;i<10;i++)
{
scanf("%d",p++);
}
printf("\n");
for(i=0,--p;i<10;i++,p--)
{
printf("%d\t",*p);
}
}可以到这dayin
1 2 3 4 56 7 8 9 056 45
45 56 9 8 7 56 4 3 2 1
请按任意键继续. . .
确实容易忽略这个细节 厉害,真难找{:1_1:} 表示很纠结{:5_96:} 程序没有错误。你逻辑错误,你声明了一个数组 但是数组你没初始化的时候里面存的就是随机值。 中国人习惯用1开头,美国人习惯用0开头,没办法,学人家的东西,就得跟着人家习惯来 我一开始还没发现,也有点粗心,指针越界我写时不会,但看别人程序,有时不用心 我也看出来了。哈哈!