C代码中if语句的未处理异常

时间:2013-05-23 04:05:24

标签: c visual-studio-2010

我正在使用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)

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

没有直接解决你的问题,但是:

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

您是否考虑过使用realloc()

    p = realloc(*buffer, size + 1);
    if ( p != NULL ) 
    { 
      *buffer = p; 
    }