[英]can i return a integer for int* return type in function
我正在制作一个 function ,它为数组分配 memory 并返回它,如果 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 是否可以接受,如果不是,我怎样才能使它正确?
C 标准具有intptr_t
(和uintptr_t
)类型,可以容纳任何 void 指针。
以下类型指定了一个有符号的 integer 类型,其属性是任何指向 void 的有效指针都可以转换为该类型,然后转换回指向 void 的指针,结果将与原始指针进行比较
不幸的是,它在相反的方向上不起作用。 如果转换为指针,某些 intptr_t 值可能是陷阱表示。
在可移植代码中,您不能假设(intptr_t)-1
可以转换为 void 指针。
如果 function 失败,则返回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;
}
无论如何,您都需要检查返回值——但检查指针的典型方法是:
int* ptr = make_array();
if(!ptr)
{
// error handling
}
如果你有指针作为返回值,那么一般的期望是在发生错误时你会得到一个 null 指针——你通过将-1
返回转换为指针来打破这个期望,因此会产生很大的惊喜。 除了安全之外的任何其他东西不要那样做。 只是不要那样做。
如果您希望能够返回错误代码,请明确执行此操作:一种可能的变体可能如下所示
int make_array(int** target)
{
*target = malloc(/*...*/);
if(!*target)
{
return -1;
}
// ...
return 0;
}
另一种变体可能会返回指向数组的指针并接受指向int
的指针以将错误代码存储在: int* make_array(int* error_code)
,请参阅@0_______的答案。
但是请注意,在给定的情况下,此信息(两种变体)是多余的,并且除了简单地返回 null 指针之外没有提供更多信息,因此我建议宁愿坚持使用以前的变体。
一旦您需要能够区分各种不同的错误条件,错误代码样式就会变得有趣,但这里似乎并非如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.