为何C语言函数中定义的struct实例会保留之前的数据?
问题原因及解决方法
原因
你在readLines函数里定义的struct result r是局部变量,C语言中局部变量默认不会被自动初始化,它的内存来自栈空间,栈里会残留之前函数调用或程序运行留下的垃圾数据。而你用strcat(r.part, sym)拼接字符时,strcat需要找到目标字符串的末尾(也就是第一个'\0'的位置)才会追加内容,但初始状态下r.part里没有'\0',它会把栈里的垃圾数据当成有效字符串,新读取的内容会被追加到这些垃圾数据后面,看起来就像是保留了之前的数据。
另外还有个隐藏问题:你用char sym[1];然后调用strcat(r.part, sym),这里的sym不是合法的C字符串(缺少字符串结束符'\0'),strcat会一直读取内存直到遇到'\0',这属于未定义行为,可能会导致更严重的错误。
解决方法
- 初始化结构体成员
每次创建struct result r后,先清空part数组并初始化结束标志:
struct result readLines(int count) { int lines_readed = 0; struct result r; // 初始化:清空part数组,设置文件结束标志为0 memset(r.part, 0, sizeof(r.part)); r.is_end_of_file = 0; if (count == 0) { count = -1; } // 后续原有逻辑不变... }
如果不想用memset,也可以直接给part的第一个元素赋值'\0'来快速设为空字符串:r.part[0] = '\0';,不过memset能确保整个数组被清零,更稳妥。
- 修复
sym的字符串合法性问题
把sym改成长度为2的数组,每次读取字符后手动添加字符串结束符:
char sym[2]; sym[0] = (char)fgetc(file); sym[1] = '\0'; // 加上这行,让sym成为合法的C字符串
内容的提问来源于stack exchange,提问作者user17252149
相关产品推荐
相关产品推荐

