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

多次指针赋值是否会导致内存溢出?C语言内存管理疑问

关于C语言字符串常量赋值与内存溢出的疑问解答

核心结论

循环中反复给char指针赋值不同字符串常量不会导致内存溢出,原因在于字符串常量的存储机制和赋值操作的本质。

详细解释

  • 字符串常量的存储特性:
    像"Hello World OLD"这类字符串常量,在程序编译阶段就会被存入只读数据段(通常是.rodata段),这块内存是固定分配的,程序运行期间始终存在,不会被操作系统回收,也不会在运行时重复分配新的内存空间。也就是说,无论你多少次赋值"Hello World OLD",指针指向的都是同一个预分配好的内存地址。

  • 循环赋值操作的本质:
    你的循环代码中,pchar1 = "Hello World OLD";和pchar1 = "Hello World NEW";只是修改指针变量pchar1本身的指向,让它切换到两个预存的常量地址上,并没有在运行时申请新的堆内存或栈内存。每次循环都只是改变指针的值,不会产生新的内存分配,自然不存在内存溢出的问题。

  • 对比动态内存分配的情况:
    如果是用malloc/calloc等函数动态分配内存后,未释放就重新赋值指针,才会导致内存泄漏(无法追踪已分配的内存,最终可能耗尽可用内存)。但字符串常量不属于动态分配的内存,完全不存在这个问题。

  • 关于旧地址可访问的现象:
    你实验中能通过保存的旧地址读取原字符串,是因为字符串常量在整个程序生命周期内都驻留在只读数据段,不会被销毁,和指针是否还指向它无关。

补充验证

你可以在编译时查看程序的段信息(比如用size命令),会发现只读数据段的大小是固定的,不会因为循环次数增加而变大,这也能证明没有新的内存被分配。

内容的提问来源于stack exchange,提问作者Edher Carbajal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:37:41