我正在制作一个函数,为数组分配内存并返回它,如果malloc((失败,则返回int-1以显示它失败了。
int *make_array() {
int *array = malloc(sizeof(int) * 3);
if (array == NULL)
return -1;
array[0] = 5;
array[1] = 9;
array[2] = 3;
return array;
}
返回类型为int*,这对于数组来说是正确的,但如果失败,则返回-1,而不是int*。当返回类型为int时,返回-1可以接受吗?如果不能,我如何使其正确?
无论如何,您都需要检查返回值,但检查指针的典型方法是:
int* ptr = make_array();
if(!ptr)
{
// error handling
}
如果有指针作为返回值,那么通常的期望是在出现错误时得到一个空指针,并且通过返回转换为指针的-1
来打破这种期望,从而产生巨大的惊喜除了安全之外,其他的都可以不要那样做。只是不要那样做。
如果您希望能够返回错误代码,请显式地执行!一种可能的变体可能如下:
int make_array(int** target)
{
*target = malloc(/*...*/);
if(!*target)
{
return -1;
}
// ...
return 0;
}
另一种变体可能会返回指向数组的指针,并接受指向int
的指针,以在以下位置存储错误代码:int* make_array(int* error_code)
,请参阅@0___________的答案。
不过,请注意,在给定的情况下,这些信息(两种变体(都是多余的,并且除了简单地返回一个空指针之外,不会提供更多的信息,所以我建议使用上一个变体。
只要您需要能够区分各种不同的错误条件,错误代码风格就会变得有趣起来,不过这里的情况似乎并非如此。
C标准具有intptr_t
(和uintptr_t
(类型,可以容纳任何空指针。
以下类型指定具有属性的带符号整数类型任何指向void的有效指针都可以转换为此类型,然后转换回指向void的指针,结果将相等到原始指针
不幸的是,它并没有朝着相反的方向工作。如果转换为指针,某些intptr_t值可能是陷阱表示。
在可移植代码中,您不能假设(intptr_t)-1
可以转换为void指针。
如果功能失败,则返回NULL
。
如果你想返回一些额外的状态信息,只需添加一个额外的参数
int *make_array(int *status)
{
int *result;
/* some code */
if(status) //caller might not need to know the status
{
*status = status_code;
}
return result;
}