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

使用动态内存分配复制字符串失败,求问题排查与解决

问题分析与修复

你的代码存在两个核心问题,导致字符串复制功能无法正常工作:

1. 循环逻辑错误,未正确终止字符串

do-while循环的执行顺序是先复制字符再自增下标,随后判断下一个字符是否为\n或\0。这会导致:

  • 当s1的当前字符是终止符时,循环直接结束,不会将该字符复制到s3;
  • s3末尾未添加字符串终止符\0,puts函数依赖\0识别字符串结束位置,缺少它会输出内存中的乱码。

2. 冗余内存分配(非致命但需优化)

s2分配了内存但全程未使用,属于不必要的内存开销,可直接删除。


修复后的代码

#include <stdlib.h>
#include <stdio.h>

int main() {
    char* s1, * s3;
    // 分配11字节内存(含终止符)
    s1 = malloc(11 * sizeof(char));
    s3 = malloc(11 * sizeof(char));
    
    if (s1 == NULL || s3 == NULL) { // 新增内存分配失败检查
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }
    
    fgets(s1, 11, stdin);
    
    int i = 0;
    do {
        s3[i] = s1[i]; // 用数组下标替代指针算术,可读性更强
        // 复制后立即判断当前字符是否为终止符
        if (s1[i] == '\n' || s1[i] == '\0') {
            break;
        }
        i++;
    } while (i < 10); // 限制循环次数,防止内存越界
    
    // 强制确保s3以'\0'结尾
    s3[10] = '\0';
    puts(s3);
    
    // 释放动态内存,避免泄漏
    free(s1);
    free(s3);
    
    return 0;
}

额外优化建议

  • 优先使用数组下标[]而非指针算术*(ptr+i),代码更易读;
  • 必须检查malloc的返回值,避免内存分配失败引发的程序崩溃;
  • 动态内存使用完毕后务必调用free,防止内存泄漏;
  • 限制循环最大执行次数,避免超出分配的内存范围造成越界访问。

内容的提问来源于stack exchange,提问作者Avram Bogdan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:55:30