C(使用minigw)什么时候决定停止访问指针的值?

问题描述 投票:0回答:1
#include <stdio.h>
void ar1(int *a);
int main()
{
   
int a[][3]={{100,200,300},{500,900,800},{9,88,45}};
ar1(a[0]);
    
}
void ar1(int *a)
{
    while(1)
    {++*a;
    printf("%10d",*a);
    ++a;
    printf(" || %10d \n",a);
    }

}

输出为

        101 ||    6422272 
        201 ||    6422276 
        301 ||    6422280 
        501 ||    6422284 
        901 ||    6422288 
        801 ||    6422292 
         10 ||    6422296 
         89 ||    6422300 
         46 ||    6422304 
    4194433 ||    6422308 
    6422289 ||    6422312 
    6422357 ||    6422316 
    4199049 ||    6422320 
          2 ||    6422324 
   12591553 ||    6422328
   12588985 ||    6422332
         -2 ||    6422336
          3 ||    6422340
          1 ||    6422344
    6422357 ||    6422348
 2001176782 ||    6422352
    4034561 ||    6422356
    6422405 ||    6422360
    4199158 ||    6422364
          2 ||    6422368
          1 ||    6422372
          1 ||    6422376
          1 ||    6422380
          1 ||    6422384
          1 ||    6422388
          1 ||    6422392
 2004908970 ||    6422396
    4034561 ||    6422400
 2004908945 ||    6422404
    6422493 ||    6422408
 2007416108 ||    6422412
    4034561 ||    6422416
  991310042 ||    6422420
          1 ||    6422424
          1 ||    6422428
    4034561 ||    6422432
          1 ||    6422436
          1 ||    6422440
          1 ||    6422444
          1 ||    6422448
          1 ||    6422452
          1 ||    6422456
          1 ||    6422460
          1 ||    6422464
          1 ||    6422468
    6422417 ||    6422472
          1 ||    6422476
    6422501 ||    6422480 
 2007494273 ||    6422484
 1288080694 ||    6422488
          1 ||    6422492
    6422509 ||    6422496
 2007415984 ||    6422500
          0 ||    6422504
 2007601904 ||    6422508
          1 ||    6422512
          1 ||    6422516
    4199137 ||    6422520
    4034561 ||    6422524
          1 ||    6422528

为什么停在那里? 这些值代表什么?

我尝试使用指针访问二维数组。然后我尝试访问内存,直到内存结束为止我不应该访问内存。它有时会停止。我想知道为什么?

对我来说,它似乎到达了分配给编译器的内存末尾。这些不是胡言乱语而是自引用指针?我

c pointers
1个回答
0
投票
  1. ar1()
    :指针
    a
    只能在底层数组末尾超过1时形成。因为你的程序是未定义的行为。
  2. ar1()
    :指针只能对底层数组的 3 个元素进行取消引用 (
    *a
    )。这是另一种未定义的行为,当程序尝试读取它无权访问的内存时,通常会导致分段错误。这可能就是你的程序停止在原地的原因。
  3. ar()
    :格式说明符
    %d
    用于打印
    int
    ,但您向其传递一个指针。这是另一个未定义的行为。相反,您想使用
    %p
    并将指针投射到
    (void *)
    。第一个
    int
    值是存储在数组中
    main()
    中的值,但增加 1,第二个值是该
    int
    条目的地址。

这是你的程序的一个表现良好的版本:

#include <stdio.h>

void ar1(int *a, size_t n) {
    for(size_t i = 0; i < n; i++) {
        ++*a;
        printf("%10d",*a);
        ++a;
        printf(" || %p \n", (void *) a);
    }
}

int main(void) {
    int a[][3]={{100,200,300},{500,900,800},{9,88,45}};
    ar1(a[0], sizeof a[0] / sizeof *a[0]);

}

和输出(即使在我的机器上,运行地址也会改变):

       101 || 0x7ffc17037444 
       201 || 0x7ffc17037448 
       301 || 0x7ffc1703744c 
© www.soinside.com 2019 - 2024. All rights reserved.