You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在指针与地址场景下实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:53:34