fread失败,VS2008为64位

fread fails with VS2008 64-bits

本文关键字:64位 VS2008 失败 fread      更新时间:2023-10-16

我目前正在使用Visual Studio 2008将一个软件从32位移植到64位,我遇到了一个关于fread的问题,当调用时会导致segfault:

以下是重现此问题的代码示例:

void somefunction(std::string filepath)
{
    FILE* myfile = fopen(filepath.c_str(),"rb"); // returns a valid handle
    if (myfile)
    {
        char* buffer = new char[BUFFER_SIZE+1];
        memset(buffer,0,BUFFER_SIZE+1);
        fread(buffer,1,BUFFER_SIZE,myfile); // segfault happens here
        fclose(f);
    }
}

CCD_ 2和CCD_ 3不报告任何错误,并且在编译32位时可以读取该文件。当在64位上输入fread时,它总是触发segfault。

我尝试过其他几种文件读取方法(使用ifstream和Qt的QFile),它们都能工作。

不幸的是,fread在代码的许多其他地方都有使用,在更改使用它的每一位代码之前,我想知道它在VS200864位的实现中是否有什么特殊之处

提前谢谢。

好吧,伙计们,我想我想通了。

此问题似乎与调试模式下的msvcrt链接有关。

fread调用位于链接到msvcrtd.lib的库中,而引发错误的可执行文件则链接到了msvcrt。

我有点惊讶这只会引起fread的问题。libc符号是否位于Windows下的msvcrt中?

无论如何,我目前正在清理我的链接标志。很抱歉无法发布更详细的代码示例。我们在非常严格的NDA下工作,我不排除这与链接标志^^'

有关