fread因VS2008 64位而失败

时间:2014-04-09 07:55:16

标签: c++ visual-studio-2008 64-bit libc

我目前正在使用Visual Studio 2008将软件从32位移植到64位,我遇到了fread的问题,这会导致在调用时导致段错误:

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

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);
    }
}

GetErrorferror不报告任何错误,并且在编译32位时可以读取文件。它虽然在64位上输入fread时总是会触发段错误。

我已尝试过其他几种文件阅读方法(使用ifstream和Qt' QFile)并且它们有效。

不幸的是,fread在代码中的许多其他地方使用,我想知道在改变使用它的每一段代码之前是否有一些特殊的VS2008 64位实现。

提前致谢。

1 个答案:

答案 0 :(得分:1)

好的家伙,我想我已经明白了。

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

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

我有点意外,这只会引起恐惧问题。 libc符号是否位于Windows下的msvcrt内?

无论如何,我目前正在清理我的链接标记。很抱歉没有能够发布更详细的代码示例。我们在非常严格的NDAs下工作,我没有想到这与链接标志有关^^'