我正在玩C中的指针,我似乎无法理解我得到的结果.
查看循环后的最后一次迭代和print语句,为什么我在for循环内外得到不同的值?
#include <stdio.h>
int main(void)
{
int *ptr;
int a1[] = {2, 5, 4, -1};
ptr = &a1[0];
for (int i = 0; i < 4; i++)
{
printf("######## ITERATION %d ########\n", i);
printf("a1[%d] = %d. \n", i, a1[i]);
printf("Current location - %ld \n", ptr);
ptr = ptr + 1;
printf("Next value would be - a1[%d] = %d at location - %ld\n\n\n", i+1, *ptr, ptr);
}
printf("%ld - %d\n", ptr, *(ptr));
}
Run Code Online (Sandbox Code Playgroud)
这将是输出 -
*** ITERATION 0 ***
a1[0] = 2.
Current location - 2686728
Next value would be - a1[1] = 5 at location - 2686732
*** ITERATION 1 ***
a1[1] = 5.
Current location - 2686732
Next value would be - a1[2] = 4 at location - 2686736
*** ITERATION 2 ***
a1[2] = 4.
Current location - 2686736
Next value would be - a1[3] = -1 at location - 2686740
*** ITERATION 3 ***
a1[3] = -1.
Current location - 2686740
Next value would be - a1[4] = 3 at location - 2686744
2686744 - 4
Run Code Online (Sandbox Code Playgroud)
看看我从上一次迭代得到的东西 - 位置是2686744,值是3,一旦我在for循环中进行相同的打印OUTSIDE,它的值为4,对于相同的地址 ......
这导致了2个问题 -
提前致谢!
可能你正在查看存储循环变量的内存位置i(当时是哪个值3).请注意,从而进入未定义行为的领域.您不能访问数组边界之外的内存.
循环结束后,该位置的变量(先前存在的)再次增加.因此你观察到了4.请注意,这也是未定义的行为.您不能访问属于超出范围的对象的内存区域.
简而言之,任何事情都可能发生.请注意,当您做错事时,您的程序不需要崩溃,甚至不要警告您.并非所有看似有用的都是有效的代码.在这个意义上,我建议,还要重新审视函数的文档,printf()并尝试理解各种格式说明符,特别是对于指针和不同大小的整数.