读取TXT文件时指针误用导致重复输出同一字符串的问题
问题分析与解决
你的代码核心问题在于局部变量的生命周期:
在while循环里定义的char buffer2[7];是栈上的局部变量,每次循环迭代时,它会被分配到栈上的同一区域(循环结束后这块内存会被回收复用)。你把plates[idx]指向buffer2的地址,相当于数组所有元素都指向同一块内存。每次循环更新buffer2的内容都会覆盖之前的数据;循环结束后,这块内存已经不属于buffer2,此时访问它属于未定义行为,最终输出自然是最后一次写入的字符串。
修复方案
方案1:动态内存分配(推荐)
给每个车牌字符串独立分配堆内存,确保每个指针指向不同的内存块,不会被覆盖:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { // 检查命令行参数 if (argc != 2) { printf("Usage: ./read infile\n"); return 1; } char buffer[7]; char *plates[8]; FILE *infile = fopen(argv[1], "r"); int idx = 0; // 限制idx避免数组越界 while (fread(buffer, 1, 7, infile) == 7 && idx < 8) { buffer[6] = '\0'; // 替换换行符为字符串结束符 // 分配7字节内存(包含'\0') plates[idx] = malloc(7); if (plates[idx] == NULL) // 检查内存分配是否成功 { perror("malloc failed"); return 1; } strcpy(plates[idx], buffer); idx++; } // 只打印实际读取的条目,避免空指针访问 for (int i = 0; i < idx; i++) { printf("%s\n", plates[i]); free(plates[i]); // 释放分配的堆内存,避免泄漏 } fclose(infile); // 关闭文件,释放资源 return 0; }
方案2:使用二维数组
直接将plates定义为二维字符数组,每个元素自带独立存储空间,无需指针:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: ./read infile\n"); return 1; } char buffer[7]; char plates[8][7]; // 二维数组,8个元素,每个可存7个字符 FILE *infile = fopen(argv[1], "r"); int idx = 0; while (fread(buffer, 1, 7, infile) == 7 && idx < 8) { buffer[6] = '\0'; strcpy(plates[idx], buffer); idx++; } for (int i = 0; i < idx; i++) { printf("%s\n", plates[i]); } fclose(infile); return 0; }
额外注意点
- 原代码未限制
idx最大值,若文件条目超过8个会导致数组越界,修复后添加了idx < 8的判断; - 原代码未关闭文件
infile,修复后补充了fclose(infile),养成资源释放的习惯; - 动态内存分配版本必须用
free释放内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者A.Bowl
相关产品推荐
相关产品推荐

