给出这个例子的功能:
并且我只能更改函数中的else语句,我应该如何处理内存分配错误?我不能返回一些错误代码,因为函数返回void,我不能在C中抛出异常,我不能只是在一个函数中停止执行一个错误,这可能是相对于程序的其他东西而言是次要的做...我应该让指针为NULL并让调用我的函数后使用我的函数的编码器处理错误?
我可以使用的唯一函数是这些库中的函数:stdio.h,stdlib.h,string.h,stdarg.h
谢谢!
答案 0 :(得分:2)
*p = NULL;
syslog(LOG_ERR, "Memory allocation error");
答案 1 :(得分:2)
在课堂上我们做
printf("Error allocating memory.");
exit(1);
或只是exit(1)
。如果你的记忆已经满了,你可以从那里做很多事情。
答案 2 :(得分:2)
我应该让指针为NULL并让调用我的函数后使用我的函数的编码器来处理错误吗?
可能是的。
但不仅“ 在 之后”而且在之前,那就是编码器需要存储传递指针的地址副本进入你的功能点。因为如果编码器没有并且你的函数失败了程序泄漏了内存,那么namly指向引用的地址。
char * p = malloc(42);
{
char * p_save = p;
f(&p_save, "");
if (NULL == p_save)
{
/* log error or what ever is needed, including freeing p and return, exit or abort */
}
else
{
p = p_save;
}
}
free(p);
或者只是将生病的功能包装成更容易处理的东西:
int fex(char ** pp, const char * t)
{
char * p = *pp; /* Store a backup, just in case. */
f(pp, t);
if (NULL == *pp)
{
*pp = p; /* Opps, restore ... */
return -1; /* ... and indicate error. errno should already have been set by realloc in f. */
}
return 0; /* Good. */
}
或(有点脏):
char * fex(char * p, const char * t)
{
f(&p, t);
if (NULL == p)
{
return (char *) -1; /* ... and indicate error. errno should already have been set by realloc in f. */
}
return p; /* Good. */
}
将后者称为:
char * p = malloc(42);
{
char * tmp = fex(p, "");
if ((char *) -1) == tmp)
{
perror("fex() failed");
}
else
{
p = tmp;
}
}
free(p);
答案 3 :(得分:1)
通常这样处理:
abort();
在许多程序和库的实现中。