5

我正在使用 Visual Studio 2010,在以下代码片段中,fseek 之后的 if 语句出现异常。

int load_filenew(char *filename, char **buffer)
{
    int size = 0;
    FILE *fp = 0;

    fp = fopen(filename, "rb");
    if (!fp)
    {
        printf(" fopen failed.\n");
        return 1;
    }

    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    if (size)
    {
        if (*buffer)
        {
            free(*buffer);
        }
        *buffer = 0;
        *buffer = (char *)malloc(size + 1);
        if (!*buffer)
        {
            printf(" malloc failed.\n");
            fclose(fp);
            return 3;
        }
        memset(*buffer, 0, size + 1);
        fread(*buffer, size, 1, fp);
        (*buffer)[size] = '\0';
    }
    else
    {
        fclose(fp);
        return 2;
    }
    fclose(fp);

    return 0;
}

此函数在应用程序中被多次调用,但有时在加载文件时会在下一行引发未处理的异常

//exception code
if (size)
{
    if (*buffer)

请帮忙——可能的原因是什么以及如何解决?

4

2 回答 2

7

似乎buffer可能设置为NULL或其他一些无效指针,并且在取消引用它时可能会出现段错误。free如果指针无效,这也可能是您第一次调用。理想情况下,您需要向我们展示调用此函数的代码。

还要记住mallocfree在不同的函数中调用匹配是不好的形式。除非该函数只有一个目的,即分配新结构或释放现有结构(换句话说,任何资源的分配都应在与释放同一资源相同的函数中完成。唯一的例外是组成更多的函数复杂的分配和释放)。

int load_filenew(char *filename, char **buffer)
{
    int size = 0;
    FILE *fp = 0;

    if(buffer == NULL)
    {
        return 1;
    }

    fp = fopen(filename, "rb");
    if (!fp)
    {
        printf(" fopen failed.\n");
        return 2;
    }

    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    if (size)
    {
        *buffer = (char *)malloc(size + 1);
        if (!*buffer)
        {
            printf(" malloc failed.\n");
            fclose(fp);
            return 3;
        }
        memset(*buffer, 0, size + 1);
        fread(*buffer, size, 1, fp);
        (*buffer)[size] = '\0';
    }
    else
    {
        fclose(fp);
        return 3;
    }
    fclose(fp);

    return 0;
}
于 2013-05-23T04:09:22.380 回答
1

不直接解决您的问题,但是:

    if (*buffer)
    {
        free(*buffer);
    }
    *buffer = 0;
    *buffer = (char *)malloc(size + 1);

您是否考虑过使用realloc()

    p = realloc(*buffer, size + 1);
    if ( p != NULL ) 
    { 
      *buffer = p; 
    }
于 2013-05-23T07:33:51.770 回答