【发布时间】:2018-04-10 22:38:43
【问题描述】:
如何检查指向函数的指针是否已初始化? 我可以检查 NULL,但如果不是 null 可能是垃圾,对吧?
我有以下几点:
#include <stdio.h>
#include <stdlib.h>
typedef struct client_struct
{
char *name;
char *email;
void (*print)(struct client_struct *c);
} client;
void print_client(client *c)
{
if (c->print != NULL)
c->print(c);
}
int main()
{
client *c = (client *)malloc(sizeof(client));
c->email = (char *)malloc(50 * sizeof(char));
sprintf(c->email, "email@server.com");
c->name = (char *)malloc(50 * sizeof(char));
sprintf(c->name, "some name");
//Uncommenting line below work as expected, otherwise segmentation fault
//c->print = NULL;
print_client(c);
printf("\nEOF\n");
int xXx = getchar();
return 0;
}
如何检查这个指针是否真的指向函数“void (*f)(client *)”? 比较大小不起作用,因为可能会产生相同大小的垃圾,对吗? 我想要一种方法,最好根据 C 标准来完成。
【问题讨论】:
-
不可能。您无法检测变量(any 变量、指针与否)是否已初始化。因此,如果您需要检查它们的有效性,请继续初始化所有指向
NULL的指针。 -
与任何变量相同:初始化为已知的“空”值,例如
NULL,并对其进行测试。试图读取和解释未初始化的数据是徒劳的。 -
NULL是使用指针时唯一的无效值。你应该是保护垃圾值的人,同样的情况对于普通指针也是如此,如果你放垃圾你就无法知道它是垃圾还是有效值。 -
故事的寓意:不要让客户自己初始化字段。提供一个执行此操作的函数,以便他们使用一些参数调用(或不使用,默认初始化所有内容)。
-
并且不要强制返回 malloc !写
client *c = malloc(sizeof *c);
标签: c function-pointers