gcc TDM 64bit编译代码修改字符串字面量后无输出,求动态数组读取方案
问题分析:修改字符串字面量引发的程序异常
首先,你遇到的问题核心是修改了字符串字面量的内存内容,这属于C语言里的未定义行为,直接导致程序崩溃终止,所以后面的printf语句根本没机会执行。
为什么修改str[4]会出问题?
- 你定义的
char *str = "Tom 28";里,"Tom 28"是一个字符串字面量,在大多数编译器(包括TDM 64bit GCC)中,这类字面量会被存储到程序的**只读数据段(.rodata)**里,这块内存是不允许写入的。 - 当你尝试执行
str[4] = '5';时,本质是往只读内存里写数据,操作系统会直接触发内存访问错误(比如段错误),程序瞬间崩溃,后续的代码自然不会执行,也就看不到后面的输出了。
满足你动态分配字符数组需求的正确写法
如果你要操作可修改的字符串,应该用动态分配的内存(或者栈上的数组),你提到的malloc是正确的方向,下面是适配你需求的示例代码:
#include <stdlib.h> #include <stdio.h> #include <string.h> // 需要用到strcpy int main() { long long len = 10; // 动态分配内存,注意要检查malloc是否成功 char* str = malloc(sizeof(*str) * len); if (str == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } // 将字符串内容复制到动态分配的内存里(这块内存是可读写的) strcpy(str, "Tom 28"); char name[10]; int age, ret; printf("str= %s\n", str); ret = sscanf(str, "%s %d", name, &age); printf("Name: %s\n", name); printf("Age: %d\n", age); // 现在修改动态分配的内存是合法的 str[4] = '5'; printf("str= %s\n", str); ret = sscanf(str, "%s %d", name, &age); printf("Name: %s\n", name); printf("Age: %d\n", age); // 记得释放动态分配的内存,避免内存泄漏 free(str); str = NULL; // 好习惯,避免野指针 exit(EXIT_SUCCESS); }
额外注意点
- 动态分配内存后一定要检查
malloc的返回值,避免空指针访问。 - 使用完动态内存后必须用
free释放,否则会造成内存泄漏。 - 如果要复制的字符串长度可能超过你分配的
len,建议用strncpy或者先计算字符串长度再分配足够的内存,避免缓冲区溢出。
内容的提问来源于stack exchange,提问作者Mohammad Nakhaee
相关产品推荐
相关产品推荐

