如何在指针与地址场景下实现1到360的for循环?附代码问题咨询
先把你的代码贴出来方便分析:
#include <iostream> #include <cstdlib> using namespace std; int main() { int start = 0; for (int* i = &start; i <= (&start + 360); i++) { *i = 20; cout << "address: " << i << " contains: " << *i << "\n"; } return 0; }
先给新手掰明白:地址和指针到底是啥?
咱把电脑内存比作一栋超大公寓,每个房间就是一个内存单元,每个房间都有唯一的门牌号——这就是内存地址。每个房间能存点东西,比如整数、字符这类数据。
那指针呢?你可以把它当成一张小纸条,专门用来写房间的门牌号(也就是内存地址):
- 比如
int* i,意思就是“我要一张能写整数房间门牌号的纸条” &start是取变量start的门牌号,相当于把start住的那个房间的号抄到纸条i上*i就是“拿着纸条去找对应的房间,开门拿里面的东西”,也就是访问指针指向的内存内容
你的代码问题出在哪?
核心就是四个字:内存越界 + 未定义行为
先搞懂&start + 360是什么意思
start是一个单独的int变量,它只占了1个“整数房间”的空间(通常是4字节,具体看你用的系统)。指针加数字的时候,是按指针指向的类型大小跳的——比如int*类型的指针加1,相当于地址往后跳4个字节(一个int的大小)。所以&start + 360,就是从start的地址往后跳360个“整数房间”,也就是总共1440字节的内存。
但问题是:这些内存根本不属于你!它们可能是其他变量的房间,可能是系统的办公区,甚至是公寓外面的荒地——你完全没有权限碰这些地方。
为什么移除*i = 20后cout只执行一次?
当你删掉*i = 20时,第一次循环i指向的是start的合法内存,所以cout能正常输出。但第二次循环i++后,i指向了start后面的非法内存,这时候访问*i属于未定义行为——C++标准根本没说这种情况会发生什么,可能程序直接崩了,可能循环直接停了,可能输出一堆乱码,全看编译器和系统心情。在你的情况里,系统直接让循环终止了,所以只输出了一次。
那为什么加了*i = 20能多跑几次?因为你在往非法内存里写数据,可能刚好覆盖了栈里的某些临时数据(比如循环的判断条件相关的内容),导致循环能多转几次,但这依然是完全错误的,随时可能崩溃或者搞出奇怪的结果。
正确的写法应该是怎样的?
如果你想操作连续的内存,应该用数组——数组是系统给你分配的连续合法内存块:
#include <iostream> using namespace std; int main() { int arr[361]; // 直接分配361个连续的int内存(索引从0到360) for (int* i = arr; i <= arr + 360; i++) { *i = 20; cout << "address: " << i << " contains: " << *i << "\n"; } return 0; }
数组arr的地址就是第一个元素的地址,arr + 360是最后一个元素的地址,这时候所有的内存访问都是合法的,循环会稳稳执行361次。
内容的提问来源于stack exchange,提问作者user9227485

