C语言按传入参数n动态填充char数组输出乱码问题咨询
问题原因分析
乱码的核心原因是你没有给字符数组加字符串终止符'\0'。
C语言中printf的%s格式符要求输出的内容是标准C字符串,规则是必须以ASCII值为0的'\0'作为结束标记,printf读取字符时会一直向后遍历内存,直到碰到'\0'才会停止输出。
你的代码存在两个明确问题:
- 字符数组
comb的长度仅为n,刚好够存n个字母,没有预留位置存放终止符 - 遍历填充的时候只写了前n个字母,没有手动补充
'\0'
为什么硬编码n时正常,传参时部分区间异常
这是栈内存布局的随机性导致的未定义行为:
当你硬编码n的值时,编译器在编译期就能确定数组长度,栈内存分配后数组末尾的位置刚好残留了值为0的内存数据,相当于碰巧有了终止符,所以输出正常。
当你用传参的方式赋值n时,属于运行期才确定数组长度的变长数组,栈内存的布局会发生变化,部分长度的数组后面跟着的不是0值,而是栈里残留的其他脏数据,printf会把这些脏数据也输出,就形成了乱码。你观察到的只有8-15、24-26的参数出问题,只是当前编译环境、运行环境下栈内存对齐规则带来的偶然现象,不是稳定可复现的规律。
修复方案
修改后的可正常运行代码如下:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { // 新增参数合法性校验,避免无参数传入时崩溃 if (argc < 2) { printf("请传入1-26的整数参数\n"); return 1; } int n = atoi(argv[1]); if (n < 1 || n > 26) { printf("参数范围必须是1-26\n"); return 1; } // 数组长度多留1位存放终止符 char comb[n + 1]; for (int i = 0; i < n; i++) comb[i] = 'A' + i; // 直接用'A'代替魔术数65,可读性更好 // 补充字符串终止符 comb[n] = '\0'; printf("%s\n", comb); return 0; }
内容的提问来源于stack exchange,提问作者Slashstep
相关产品推荐
相关产品推荐

