0

代码块,C。我正在尝试使用 fwrite 将字符写入 .txt 文件。前几个字符被正确写入,但在它们之后文件显示:_mcleanup: tos ov. 我认为这可能是缓冲区过载。有任何想法吗?

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    FILE*p1;

    p1=fopen("Tomi.txt","w+");

    fseek(p1,0,SEEK_SET);

   // fwrite("Toth Tamas",sizeof(char),30,p1);

    while(a<10)
        {
            fwrite("Toth Tamas",sizeof("Toth Tamas"),1,p1);

            a++;

        }

    return 0;
}
4

1 回答 1

0

如果我在int a = 0;之后立即添加FILE *p1;,则程序的 while-loop 版本即使在警告最多的情况下也可以毫无怨言地编译,并且即使在 valgrind 下也可以在我的计算机上无错误地执行。您希望sizeof("Toth Tamas") - 1fwrite调用中防止将 NUL 字节写入文件,并且可能应该有一个\n“Tamas”之后,并查看我之前对其他小问题的评论,但该代码似乎大部分都可以。

但是,被注释掉的行//fwrite("Toth Tamas",sizeof(char),30,p1);确实有一个错误:字符串常量"Toth Tamas"只有 11 个字节长(计算终止的 NUL),但是您要求fwrite写入 30 个字节,因此它将访问字符串末尾之外的 19 个字节,触发未定义的行为。在上下文中,人们会期望分段错误或将垃圾写入文件。

并且“_mcleanup: tos ov”是 17 个字节长,所以如果那是可执行文件只读数据段中下一个字符串常量的(开始),那么显示为垃圾写入文件是合理的事情,我认为这就是你所说的发生了。

于 2013-09-24T21:41:43.453 回答