指针,一个不容易发现的错误
本帖最后由 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;
}
求解,这是为什么???
ba21 发表于 2017-10-1 20:02
嗯,谢谢你。
但我还想知道,就是为什么我那个会输出从0到9的数呢???{:10_254:} 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 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);
} ravenhu13 发表于 2017-10-3 06:57
楼主代码可以运行0至9??不明觉厉,第一眼看代码就觉得有问题,因为P的值是固定的,无论怎么打印*P都必须 ...
谢谢了,我之前那个代码运行之后就是那样的,可能是编译器的问题吧。我当时也是这么想的已经越界了,没想到会是这个样子呢{:10_245:} 对啊,为什么啊,当i等于不同值的时候p不都时会有对应的地址么,为什么第一个循环结束后p的地址一定是&a+4 林01 发表于 2020-3-29 19:01
对啊,为什么啊,当i等于不同值的时候p不都时会有对应的地址么,为什么第一个循环结束后p的地址一定是&a ...
因为越界了啊。因为你a实际上从a开始只到a啊,他第一个for循环,直接给干到a了,最多是a,那a自然是最大位数a往后4个字节啊。而且应该不出意外是一串奇怪的数字。
页:
[1]