#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
为什么停在那里? 这些值代表什么?
我尝试使用指针访问二维数组。然后我尝试访问内存,直到内存结束为止我不应该访问内存。它有时会停止。我想知道为什么?
对我来说,它似乎到达了分配给编译器的内存末尾。这些不是胡言乱语而是自引用指针?我
ar1()
:指针a
只能在底层数组末尾超过1时形成。因为你的程序是未定义的行为。ar1()
:指针只能对底层数组的 3 个元素进行取消引用 (*a
)。这是另一种未定义的行为,当程序尝试读取它无权访问的内存时,通常会导致分段错误。这可能就是你的程序停止在原地的原因。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