You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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',这属于未定义行为,可能会导致更严重的错误。

解决方法

  1. 初始化结构体成员
    每次创建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能确保整个数组被清零,更稳妥。

  1. 修复sym的字符串合法性问题
    把sym改成长度为2的数组,每次读取字符后手动添加字符串结束符:
char sym[2];
sym[0] = (char)fgetc(file);
sym[1] = '\0'; // 加上这行,让sym成为合法的C字符串

内容的提问来源于stack exchange,提问作者user17252149

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:45:53