繁体   English   中英

我可以在 function 中为 int* 返回类型返回 integer

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM