当void * fun()中的错误返回什么

时间:2016-03-01 12:49:10

标签: c error-handling

/*
//i comment this block, please see the updates
void* fun_one(char *buffer, long length)
{
    if(NULL == buffer)
        return  xxx; //return what value here
    ...
}

fun_two()
{
    ...
    fun_one(image->buffer, image->length);
    ...
}
*/

如果错误发生,我不希望退出程序但返回fun_two()。我该怎么办? 成功时我知道return (void *)0;return NULL;,但在出错时会返回什么值?

相关链接: void *

更新

但如果我是一个线程函数,例如

int main()
{
    ...
    pthread_create(&id1, NULL, (void*)myThread1, &param_struct);
    ...
}

void* myThread1(void* param)
{
    struct len_str* img = (struct len_str*)param;
    if(NULL == img->buf)
        return xxx;    //return what value here
    if(0 == img->len)
        return xxx;
    ...
}

相关链接: pthread_create

myThread1()的返回值为void * 如果发生错误,应该返回什么值

4 个答案:

答案 0 :(得分:3)

不是返回指针,而是返回int类型的值。

返回0表示一切正常。
返回1表示传入了NULL指针 返回2表示无效长度 ...

int fun_one(char *buffer, long length) {
    if (buffer == NULL) return 1;
    if (length == 0) return 2;
    if (length < 0) return 3;
    /* ... */
    return 0;
}

为了更加清晰(???),您可以使用枚举

enum fun_one_errors {FO_OK, FO_NULL, FO_ZERO, FO_NEG};
return FO_ZERO;

答案 1 :(得分:2)

您正在努力应对界面的“设计”。你需要传递给函数什么,它需要返回什么以及如何发出错误信号。

通常,如果返回指针,则指针值为零(NULL)表示错误。如果要传递更多信息,可以使用设置为其中一个错误代码的辅助变量。这将是一个全局变量或变量的(指针):

int my_errcode;
...
if ((p=fun_one(buf, len))==NULL) printf("error %d\n",my_errcode);

作为替代方法,您将void *指针作为参数返回(您现在必须使用双重间接)并让函数返回信号成功,或失败以及失败类型:

if ((my_errcode=fun_one(buf, len, &p))!=0) printf("error %d\n",my_errcode);

所以取决于你...

答案 2 :(得分:0)

在您的线程函数中,您将动态分配一个变量来存储返回值。您可以设置该值并返回指针。

然后当您调用pthread_join时,您将收到指向该变量的指针,然后您将其转换并取消引用以读取该值,并在完成后free

void* myThread1(void* param)
{
    int *rval = malloc(sizeof(int));
    if (rval == NULL) {
        perror("malloc failed");
        exit(1);
    }
    struct len_str* img = (struct len_str*)param;
    if(NULL == img->buf) {
        *rval = 0;
        return rval;
    }
    if(0 == img->len) {
        *rval = 1;
        return rval;
    }
    ...
}


int main()
{
    ...
    pthread_create(&id1, NULL, (void*)myThread1, &param_struct);
    ...
    void *rval;
    pthread_join(id1, &rval);
    printf("rval = %d\n", *(int *)rval);
    free(rval);
}

答案 3 :(得分:0)

那么,当返回指针时,通常会遇到如果函数执行导致错误该怎么办的问题?

经典方法是保留一个特殊值(NULL或C ++中的0)来表示这种错误,并使用全局来表示您可以拥有的不同错误值。

但是,如果您希望重入模块能够进行多线程处理,该怎么办?好吧,指针有一个问题,即如果那个地方恰好被一个非无用的变量占用,他们指向的任何地方都是可能的麻烦来源。

但我们有不同的方法。只需创建哑变量(不用于其他任何东西)来保存没有任何地址。这样,您可以保留多个指针值(这些变量的地址)来表示正确的错误代码。由于编译器找到的位置不能用于其他任何东西,它们可用于保存(而不是存储)特殊内容的地址。

int error_001_placeholder;
int error_002_placeholder;
int error_003_placeholder;

...

if (condition_1) return &error_001_placeholder;
if (condition_2) return &error_002_placeholder;
if (condition_3) return &error_003_placeholder;

然后,您将能够检查不同的无效返回指针,只需检查它们是否属于这组指针。

更重要的是,如果你想做一般的错误检查,你可以保留一个全局数组,并返回不同错误的单个单元格,最后通用检查返回的值是否是错误,你可以检查是否 returned_value >= errors_array && returned_value < errors_array + erros_array_size