我已经定义了一个结构,这是示例代码:
typedef struct {
char *like;
int age;
int class;
} info_t;
typedef struct {
info_t *tom;
info_t *jack;
} student;
如果我不申请内存空间就调用这个结构,会遇到一个
segment error
.
这样的代码:
sutdent *s1;
s1->tom->like = "play game";
那么有没有办法在调用结构成员之前检查需要调用的成员是否可用?
我做了这样的尝试:
if(s1) {
if(s1->tom) {
s1->tom->like = "play game";
}
}
但这并不总是有效,因为如果指针不手动指向NULL地址,它可能指向任何地方。
就是这样。我正在构建一个网络库,这是一个结构的定义。由于本库未来有开源的可能,如果用户在没有提前申请内存空间的情况下执行本库中的内存释放功能,可能会出现意想不到的问题。
typedef struct {
SOCKADDR *client;
SOCKADDR *receiver;
snSize size;
} snNetInfo_t;
typedef struct {
snNetSocket sockfd; // sizeof: win[8], linux[4]
sn_u32 sockfdFamily; // sizeof: 4
snNetType sockfdType; // sizeof: win[4], linux[8]
snNetInfo_t *info; // sizeof: 8
} snNet_ctx;
SN_PUBLIC(snError) snNet_malloc_init SN_OPEN_API SN_FUNC_OF(
(snNet_ctx **ctx, sn_u32 family)
) {
if(!((*ctx) = (snNet_ctx *)malloc(sizeof(snNet_ctx)))) {
// If the memory request for the snNet object fails
return snErr_Memory;
}
if(!((*ctx)->info = (snNetInfo_t *)malloc(sizeof(snNetInfo_t)))) {
// If the memory request for the info member of the snNet object fails
return snErr_Memory;
}
if(family == AF_INET) {
(*ctx)->sockfdFamily = AF_INET;
(*ctx)->info->size = SN_NET_IPV4_ADDR_SIZE;
} else if(family == AF_INET6) {
(*ctx)->sockfdFamily = AF_INET6;
(*ctx)->info->size = SN_NET_IPV6_ADDR_SIZE;
} else {
// If it is neither IPv4 nor IPv6
return snErr_NetFamily;
}
(*ctx)->info->receiver = (SOCKADDR *)malloc((*ctx)->info->size);
(*ctx)->info->client = (SOCKADDR *)malloc((*ctx)->info->size);
if(!(*ctx)->info->receiver || !(*ctx)->info->client) {
// If the memory application for receiving or client information fails
return snErr_Memory;
}
return snErr_OK;
}
SN_PUBLIC(snError) snNet_release SN_OPEN_API SN_FUNC_OF(
(snNet_ctx **ctx)
) {
if((*ctx)) {
if((*ctx)->info) {
if((*ctx)->info->receiver)
free((*ctx)->info->receiver);
if((*ctx)->info->client)
free((*ctx)->info->client);
free((*ctx)->info);
}
free((*ctx));
(*ctx) = snNull;
}
return snErr_OK;
}