使用动态内存分配复制字符串失败,求问题排查与解决
问题分析与修复
你的代码存在两个核心问题,导致字符串复制功能无法正常工作:
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
相关产品推荐
相关产品推荐

