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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:46:30