为什么我的递增指针结束但切断并打印奇怪输出的循环?



我是用指针编码的新手。这是我的密码。

#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int a = 1;
int* p = &a;
for (int i = 0;i < 10; i++) {
p++;
*(p) = rand() % 10 + 1;
cout << p << " " << *p << endl;
}
}

不知怎的,代码一直在循环结束前结束,并打印出一系列地址,但在最后一个地址中以03结束。有人能帮我到处找吗。输出:

00000073532FF808 2
00000073532FF80C 8
00000073532FF810 5
00000073532FF814 1
00000073532FF818 10
00000073532FF81C 5
00000073532FF820 9
00000073532FF824 9
0000007300000003

首先,为一个int分配了存储空间。

int a = 1;

第二个指针指向这个存储器。

int *p = &a;

现在,写入*p将修改a,但。。。

for (int i = 0;i < 10; i++) {
p++;
*(p) = rand() % 10 + 1;

即CCD_ 4递增。

即使在第一个循环中,它现在也指向a之外的内存。

该内存要么被分配给其他东西,要么被用于其他东西,或者根本没有被分配。在任何情况下,这都是未定义的行为,即写出界。

这就是未定义行为的本质,现在一切皆有可能——再也无法预测会发生什么。

如果循环在10次迭代完成之前终止,我怀疑i可能会因此而损坏。p自身也有可能发生腐蚀。这并不能改变它是"未定义行为"的事实。


OP应用程序的一个可能的解决方案是在a中提供足够的存储,其中p可以在不越界的情况下迭代。

为此,main()开始时的定义必须更改为:

int a[11] = { 1 };
int* p = a; // could also be: int* p = &a[0];

请注意,p在写入之前会递增。因此,在最后一次迭代(i=9(中,p将在写访问之前指向a[10]。因此,最小的足够数组大小是int a[11],而不是int a[10],这可能是人们第一眼就想到的。


OP的固定程序:

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int a[11] = { 1 };
int* p = a;
for (int i = 0;i < 10; i++) {
p++;
*(p) = rand() % 10 + 1;
cout << p << " " << *p << endl;
}
// double check
cout << "a:";
for (int value : a) cout << ' ' << value;
cout << endl;
}

输出:

0x7fff57151bc4 4
0x7fff57151bc8 7
0x7fff57151bcc 8
0x7fff57151bd0 6
0x7fff57151bd4 4
0x7fff57151bd8 6
0x7fff57151bdc 7
0x7fff57151be0 3
0x7fff57151be4 10
0x7fff57151be8 2
a: 1 4 7 8 6 4 6 7 3 10 2

coliru 上的实时演示

最新更新