c-我可以为函数中的int*返回类型返回一个整数吗



我正在制作一个函数,为数组分配内存并返回它,如果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; 
}

最新更新