更新C语言字符串指针时是否需要手动释放原字符串内存?
问题结论
你给出的代码既不会造成内存浪费,也不需要调用free手动释放内存。
原因说明
- C语言中用双引号包裹的字符串属于字符串字面量,这类内容会在程序编译时就确定存储位置,程序加载后存放在进程的只读数据段(.rodata段)。这部分内存由操作系统在程序启动时自动分配,程序退出时自动回收,完全不需要开发者手动管理。
free函数仅用于释放malloc/calloc/realloc这类堆内存分配函数手动申请的堆内存,你这段代码没有任何堆内存分配操作,自然不需要调用free。- 你观测到的两个不同地址,就是两个字符串字面量在只读数据段的存储地址,你只是修改了
demo指针的指向,没有产生任何需要手动回收的内存。
注意边界情况
只有当你手动从堆上申请内存存储字符串时,修改指针指向才需要先释放原有内存,示例如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { // 从堆上申请10字节内存,这部分需要手动释放 char *demo = malloc(10); strcpy(demo, "demo"); // 修改指针前需要先释放原有堆内存,否则会产生内存泄漏 free(demo); // 重新指向字符串字面量,无需释放 demo = "Hello World"; return 0; }
另外注意:绝对不要尝试free字符串字面量的地址,这会触发未定义行为,通常会直接导致程序崩溃。
内容的提问来源于stack exchange,提问作者aszswaz
相关产品推荐
相关产品推荐

