指针的值在for循环内外是不同的

tho*_*mas 1 c pointers

我正在玩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个问题 -

  1. 这个价值甚至来自哪里?在2686740之后显然没有任何东西.这就是数组结束的地方......
  2. 为什么2686744在循环内部和外部打印时有不同的值?

提前致谢!

Spi*_*rix 8

首先,用于%p打印指针.然后,当您a[4]在最后一次迭代中(在递增之后ptr)访问array()的第5个元素时,代码中存在未定义的行为.这就是为什么你得到不同的价值观.


moo*_*eep 5

可能你正在查看存储循环变量的内存位置i(当时是哪个值3).请注意,从而进入未定义行为的领域.您不能访问数组边界之外的内存.

循环结束后,该位置的变量(先前存在的)再次增加.因此你观察到了4.请注意,这也是未定义的行为.您不能访问属于超出范围的对象的内存区域.

简而言之,任何事情都可能发生.请注意,当您做错事时,您的程序不需要崩溃,甚至不要警告您.并非所有看似有用的都是有效的代码.在这个意义上,我建议,还要重新审视函数的文档,printf()并尝试理解各种格式说明符,特别是对于指针和不同大小的整数.