用C实现Linux cat命令时函数触发段错误,请求排查问题
问题分析与修复
核心段错误原因
- 野指针非法访问:代码中
char *string;仅声明指针但未分配有效内存,属于未初始化的野指针。调用fgets(string, 100, f)时,会向随机内存地址写入数据,直接触发段错误。
其他逻辑问题
- 首行丢失:函数开头先调用了一次
fgets却未处理,导致文件第一行内容被直接跳过,不会输出。 - 空行判断失效:
strlen(string) == 0无法识别空行,因为fgets读取空行时会把换行符\n存入缓冲区,此时strlen(string)的值为1而非0,正确判断应为string[0] == '\n'。
修复后的代码
void output_opt1_file(char *name_file) // 函数打开文件并仅为非空行编号 { FILE *f = fopen(name_file, "rt"); if (f != NULL) { // 在栈上分配固定大小的缓冲区,避免野指针问题 char string[100]; int i = 1; // 直接循环处理所有行,避免首行丢失 while (fgets(string, sizeof(string), f) != NULL) { if (string[0] == '\n') { printf("%s", string); } else { printf("%d ", i); ++i; printf("%s", string); } } fclose(f); } }
修复说明
- 将
char *string;改为char string[100];,在栈上分配固定大小的有效内存缓冲区。 - 移除开头多余的
fgets调用,直接进入循环处理每一行,避免首行丢失。 - 修正空行判断条件为
string[0] == '\n',准确识别仅含换行符的空行。
内容的提问来源于stack exchange,提问作者Volk
相关产品推荐
相关产品推荐

