Mat*_*eus 0 c malloc struct pointers
我有以下结构:
struct scp_header {
char state_name[NAME_MAXSIZE];
enum scp_packet_type type;
size_t payload_size;
size_t script_size;
};
Run Code Online (Sandbox Code Playgroud)
我想在几个函数中使用这个结构,但我需要做的第一件事是填充字段state_name,为了做到这一点,我的函数的一部分执行以下操作:
struct scp_header *header;
if ((header = malloc(sizeof(struct scp_header)) == NULL))
return -1;
if (header->state_name == NULL)
printf("This field is NULL\n");
header->type = INIT;
header->payload_size = 0;
header->script_size = total_code_size;
Run Code Online (Sandbox Code Playgroud)
我做了上面的验证,因为当我尝试使用时,strncpy(header->state_name, "sometext", NAME_MAXSIZE)我遇到了分段错误。所以我决定检查该state_name字段是否不是 NULL 并且我真的进入了 if 语句,该语句表明该字段是NULL.
我的问题是:为什么这个字段是NULL如果我分配了整个结构,它应该malloc为那个字段分配必要的内存,不是吗?
(Ab) 以这种方式使用括号非常危险,因为您很容易绊倒。
if ((header = malloc(sizeof(struct scp_header)) == NULL))
在这里,将 malloc 调用的结果与NULL(运算符优先级,== 的优先级高于 =)进行比较。当 malloc 成功时,它返回一个非 NULL 值,上述比较结果为 0,然后将其分配给header。if 语句检查header并且只会在header非零时返回。
使固定: if ((header = malloc(sizeof(struct scp_header))) == NULL)
但我强烈建议您考虑更清晰的样式。