如何使用malloc为已分配内存的结构体中的char指针成员分配空间
问题解答
结论
第二种写法正确,第一种写法存在严重错误。
错误原因说明
你定义的结构体中request_line的类型是char *(字符指针),本身是用来存储内存地址的变量:
- 第一种写法
*(con_obj->request_line) = malloc(sizeof(char )*val);存在两个问题:- 对
request_line做解引用操作*后,拿到的是指针指向的char类型的单个字符值,而malloc返回的是void*类型的内存地址,二者类型完全不匹配,编译阶段就会报错。 - 此时
request_line还未被赋值,属于野指针,直接解引用野指针会触发未定义行为,大概率直接导致程序崩溃。
- 对
- 第二种写法
con_obj->request_line= malloc(sizeof(char )*val);是正确的:直接将malloc返回的内存地址赋值给char*类型的request_line指针变量,类型完全匹配,符合内存分配的逻辑。
最佳实践建议
- C标准规定
sizeof(char)恒等于1,因此malloc的参数可以直接写val,写法更简洁。 - 内存分配后建议增加判空逻辑,避免
malloc申请失败返回空指针导致后续操作异常:
con_obj->request_line = malloc(val); if (con_obj->request_line == NULL) { // 自定义内存分配失败的处理逻辑 }
- 程序使用完结构体后,需要先释放
request_line指向的内存,再释放con_obj本身的内存,避免出现内存泄漏:
free(con_obj->request_line); free(con_obj);
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

