C 以奇怪的方式使用fwrite
如果我写C 以奇怪的方式使用fwrite,c,io,fwrite,C,Io,Fwrite,如果我写 if((fp = fopen(some_path, "wb"))) { int a = 50000; fwrite("c",sizeof(char),a,fp); fclose(fp); fp = fopen(some_path, "rb"); char arr[50000]; fread(arr, sizeof(char), a, fp); printf("%s\n", arr); fclose(fp); } 它
if((fp = fopen(some_path, "wb")))
{
int a = 50000;
fwrite("c",sizeof(char),a,fp);
fclose(fp);
fp = fopen(some_path, "rb");
char arr[50000];
fread(arr, sizeof(char), a, fp);
printf("%s\n", arr);
fclose(fp);
}
它当然会打印“c”,但文件大小约为50kb
我的问题是:
c之后访问内存中的任何内容␀代码>由“c”
创建。当它崩溃时,这是因为您到达了无法读取的内存页(例如,尚未分配)
fwrite()向文件写入什么内容才能使文件大小达到~50kb
在“c”
及其后返回的地址处内存中发生的任何事情
仍然只打印“c”(我在这里期待一些曼波巨星字符)
它不仅打印c
。尝试类似于hextump-C文件
或od-C文件
这个函数的用法有多错误
难以置信。如果a
的任何值大于2,它都可能崩溃
我想非常快地编写一个特定大小的空白文件(使用虚拟数据)
truncate
的文档中说:“如果以前的文件较短,它将被扩展,扩展部分将读取为空字节('\0')”,因此您可以使用以下内容:
if(截断(路径、长度)){
perror(“截断”);
出口(1);
}
提示:sizeof(char)
保证1
fread
不保证缓冲区将被NUL终止,因此将缓冲区发送到printf“%s”
fwrite将写入字符串“c”
直到50000
chars,虽然字符串只包含两个已知字符'c'
和'\0'
,但fwrite将从内存中写入字符(不可寻址访问),而您只获得输出c
的原因是printf一直在读取,直到它到达空终止符,在本例中,空终止符就在'c'
字符之后,试着打开文件看看你自己谢谢你的解释,我想这不应该起作用,但它还是起了作用。。让我很好奇的是,访问随机内存“仅仅”是一种未定义的行为。撞车是一种可能性,但不是唯一的一种。