我是用指针编码的新手。这是我的密码。
#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 上的实时演示