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)
请帮忙 - 可能的原因是什么以及如何解决?
当您取消引用它时,它似乎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;
}
Run Code Online (Sandbox Code Playgroud)
不直接解决您的问题,而是:
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)
| 归档时间: |
|
| 查看次数: |
374 次 |
| 最近记录: |