gpt4 book ai didi

c++ - fread 上的段错误。帮助!

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:14 26 4
gpt4 key购买 nike

typedef struct {

unsigned char b1, b2;

} cont;

cont buf[1024];

int main(int argc, char *argv[]) {

FILE* fp;

fp = fopen(argv[1], "rb")

if(fp!=NULL)

fread(buf, sizeof (cont), sizeof (buf), fp);

//do something with buf
return 0;

}

你好,当我尝试运行这个程序时遇到了段错误。突然间,它可以正常工作了。故障错误出现。 fread 函数调用正在生成错误。请帮助我!

最佳答案

您错误地使用了 fread() - arg#1 是要读取的元素的大小,arg#2 是要读取的元素的数量(在您的情况下应该是 1024)。

因此,您所做的读取 sizeof (cont) * sizeof (buf) 个字节,这会溢出您的缓冲区。

参见:

http://www.opengroup.org/onlinepubs/009695399/functions/fread.html

用于功能文档。

澄清一下,您想要读取 1024 个元素,但 sizeof(buf) 是 2048(至少,如果该结构由您平台的 ABI 填充,则可能更多)。

示例(编码以便它们不依赖于特定数量的元素):

fread(buf, 1, sizeof(buf), fp);    // fills the buffer (assuming it's buf[...])
fread(buf, sizeof(*buf), sizeof(buf)/sizeof(*buf), fp); // ditto

即如果你想通过 sizeof() 传递目标缓冲区的总大小,那么另一个参数必须是一个,而如果你想传递数据结构的大小,那么另一个参数是适合缓冲区的数量。

关于c++ - fread 上的段错误。帮助!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4365166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com