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

pri*_*iya 5 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;
}
Run Code Online (Sandbox Code Playgroud)

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

//exception code
if (size)
{
    if (*buffer)
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*tis 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 换句话说,任何资源的分配都应该在与同一资源的重新分配相同的功能中完成 (2认同)

And*_*rsK 1

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

    if (*buffer)
    {
        free(*buffer);
    }
    *buffer = 0;
    *buffer = (char *)malloc(size + 1);
Run Code Online (Sandbox Code Playgroud)

你考虑过用它realloc()代替吗?

    p = realloc(*buffer, size + 1);
    if ( p != NULL ) 
    { 
      *buffer = p; 
    }
Run Code Online (Sandbox Code Playgroud)