gpt4 book ai didi

检查指向函数的指针是否已初始化

转载 作者:太空宇宙 更新时间:2023-11-04 04:17:54 25 4
gpt4 key购买 nike

如何检查指向函数的指针是否已初始化?我可以检查 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 标准完成该操作的方法。

最佳答案

如评论中所述,不可能 100% 确定指针是否是垃圾。

为避免这种情况,您可以提供一个“构造函数”函数,如下所示:

struct client_struct* client_allocate()
{
struct client_struct* object = malloc(sizeof *object);
if (object)
{
object->name = NULL;
object->email = NULL;
object->print = NULL;
}
return object;
}

然后在您的文档中写下创建“客户”的唯一有效方法是使用您的函数。如果这样做,您还应该提供一个 destroy 函数,您可以在其中调用 free

假设有一天您向您的struct 添加了一个新指针。然后更新 client_allocate 函数,将此指针设置为 NULL,新指针将始终正确初始化。无需更新代码中分配了 struct 的所有位置,因为现在只有一个这样的位置。

关于检查指向函数的指针是否已初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49753300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com