C语言构建char后缀数组时为何出现null chars导致输出错误?
问题原因
- 数组越界访问:你定义的字符数组
s长度为7,合法下标范围是0~6。代码中判断j<7时就执行j++,当j初始值为6时,判断条件成立后j会自增为7,后续访问s[7]已经超出数组的合法范围,属于未定义行为,读取到的是内存中不确定的脏数据,就是你观察到的空字符的来源。 - 后缀截取逻辑错误:7个字符的所有后缀长度是依次递减的,分别为7、6、5、4、3、2、1,总和刚好为28。但你当前的逻辑是每个后缀都固定读取8个字符(从k到7共8个下标),不仅包含越界的脏数据,还会因为总长度限制导致后续后缀无法完整输出,和你给出的实际输出表现完全吻合。
修复代码
#include <stdio.h> #include <stdlib.h> static char *suffix; int main() { char s[7] = {'c','o','n','n','e','c','t'}; suffix = (char*)malloc(sizeof(char)*28); int write_pos = 0; // 遍历每个后缀的起始位置 for (int start = 0; start < 7; start++) { // 每个后缀的长度为 7 - start for (int i = start; i < 7; i++) { suffix[write_pos] = s[i]; printf("%c ", suffix[write_pos]); write_pos++; } // 不同后缀之间加空格分隔,不需要可删除 printf(" "); } // 动态分配内存用完记得释放 free(suffix); return 0; }
修复后运行会输出完整的所有后缀字符,总长度刚好为28,不存在越界访问问题。
内容的提问来源于stack exchange,提问作者user10836656
相关产品推荐
相关产品推荐

