如果函数有错误,该返回什么?

时间:2010-11-21 09:57:02

标签: c return-value

gcc 4.5.1 c89

我有一个分配以下结构元素的函数:

static struct Config_t {
    char protocol[LINE_SIZE];
    char mode[LINE_SIZE];
} *app_config = NULL;

使用malloc和memset分配和清除内存的功能。

一旦完成,我就有了获取各个元素的函数:

char* get_mode()
{
    if(app_config->mode != NULL) {
        return app_config->mode;
    }
    return NULL;
}

我在检查是否已分配值。如果没有,则返回NULL。所以在调用函数中我可以检查是否返回NULL。但是,如果有更好的方法可以做到这一点?

非常感谢任何建议,

3 个答案:

答案 0 :(得分:3)

在C中,返回NULL以获取错误条件是返回指针的函数的标准做法,因此您在那里处于良好状态。 (对于不返回指针的函数,通常的约定是成功时返回0,错误时返回非零错误代码。)


另外,也许有点偏离主题:mode不能NULL,但是,它可以吗? app_config当然可以是NULL,它是指向结构的指针,但是您的mode被定义为数组,结构的固有部分,而不是指针。你要么拥有结构,要么没有结构,但你不会只有结构的部分。简单地为结构分配内存将为LINE_SIZE分配mode个字符;实际上,sizeof(struct Config_t) == LINE_SIZE + LINE_SIZE,结构一个字符数组,后跟另一个字符数组。没有涉及指针(app_config除外,因为您已将其定义为指向结构的指针)。

因此,要完全分配struct Config_t,请执行以下操作:

app_config = malloc(sizeof(*app_config));

(或app_config = malloc(sizeof(struct Config_t));如果您的平台不允许上述内容。)分配mode,不需要任何其他内容。

如果将mode定义为char *,则会有所不同:

static struct Config_t {
    char *protocol;
    char *mode;
} *app_config = NULL;

现在sizeof(struct Config_t) == 2 * sizeof(void*)(见下文),结构本身只包含两个指针,而不是它们可能指向的任何数据。分配结构为它们分配任何存储空间。

#include <stdio.h>

#define LINE_SIZE (200)

struct Config_t {
    char protocol[LINE_SIZE];
    char mode[LINE_SIZE];
};
struct Config_t_with_pointers {
    char *protocol;
    char *mode;
};

int main(int argc, char* argv[])
{
    printf("sizeof(struct Config_t) = %zu\n", sizeof(struct Config_t));
    printf("sizeof(struct Config_t_with_pointers) = %zu\n", sizeof(struct Config_t_with_pointers));
    return 0;
}

(考虑到你的编译器,我可以随意使用z格式说明符作为size_t参数,因为任何最近的gcc都有它[并且它符合C99标准,Matthew告诉我们] 。)

输出(在我的64位Linux系统上):

sizeof(struct Config_t) = 400
sizeof(struct Config_t_with_pointers) = 16

答案 1 :(得分:1)

基于内置C函数的定义,例如gets(),返回NULL是指示无法进行赋值或分配的理想方式。

答案 2 :(得分:1)

好吧,因为发生这种情况的唯一原因是一个(如果没有分配值),则不需要多个值来区分它们。 此外,NULL不是有效的指针,所以我没有看到任何错误。

如果您有更多可能的错误,可以使用errno.h来实现此目的。