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。但是,如果有更好的方法可以做到这一点?
非常感谢任何建议,
答案 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来实现此目的。