C,void返回函数中的错误处理

时间:2013-12-08 18:12:09

标签: c malloc

给出这个例子的功能:

并且我只能更改函数中的else语句,我应该如何处理内存分配错误?我不能返回一些错误代码,因为函数返回void,我不能在C中抛出异常,我不能只是在一个函数中停止执行一个错误,这可能是相对于程序的其他东西而言是次要的做...我应该让指针为NULL并让调用我的函数后使用我的函数的编码器处理错误?

我可以使用的唯一函数是这些库中的函数:stdio.h,stdlib.h,string.h,stdarg.h

谢谢!

4 个答案:

答案 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();

在许多程序和库的实现中。