我正在使用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)
请帮忙 - 可能的原因是什么以及如何解决?
答案 0 :(得分:7)
似乎buffer
可能设置为NULL
或其他一些无效指针,并且当您取消引用它时可能会出现段错误。如果指针无效,它也可能是您对free
的第一次调用。理想情况下,您需要向我们展示调用此函数的代码。
另请注意,在不同的功能中调用匹配的malloc
和free
是不好的形式。除非该函数只有一个目的,分配新结构或释放现有结构(换句话说,任何资源的分配应该在与同一资源的重新分配相同的功能中完成。唯一的例外是组成更多的函数复杂的分配和解除分配)。
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;
}