malloc()分配失败处理咨询:特定判断语句的用法解析
关于malloc分配判断语句的逻辑解析与使用建议
先拆解你疑惑的那句if ((result = malloc(sizeof(char) * (strlen(s1) + strlen(s2) + 1))) != 0)的运作逻辑:
- 内存分配计算:
sizeof(char) * (strlen(s1) + strlen(s2) + 1)是计算需要分配的内存大小——s1的长度加s2的长度,再加1是为字符串终止符'\0'预留空间,sizeof(char)固定为1,写出来是为了代码逻辑更清晰(也可省略)。 - 赋值与优先级控制:括号
(result = malloc(...))是核心,因为C语言中!=的优先级高于=,如果不加括号,代码会先判断malloc(...) != 0,得到0或1的布尔值后再赋值给result,完全违背了保存malloc返回指针的目的。加括号后,会先执行result = malloc(...),把malloc的返回值(成功时是内存地址,失败时是NULL)赋值给result。 - 分配结果判断:最后判断
result != 0,即检查malloc是否成功。如果成功(result非空),进入if块执行字符串拼接;失败则直接返回0(等价于NULL)。
使用建议
- 必须保留括号:这是最关键的点,省略括号会导致逻辑完全错误,
result会被赋值为0或1,而非内存指针。 - 用NULL替代0更清晰:C语言中
NULL是专门表示空指针的宏,虽然0和NULL在指针语境下等价,但写成!= NULL能更明确这是在判断指针是否为空,可读性更强。 - 补全参数合法性检查:原代码未判断
s1或s2是否为NULL,一旦传入空指针,strlen(NULL)会触发未定义行为(程序崩溃或异常),建议在malloc前先添加:if (!s1 || !s2) return NULL; - 修正函数返回值类型:原代码的函数声明
char strjoin(...)错误,应改为char *strjoin(...),因为函数要返回字符指针,返回char类型会导致编译错误。 - 变量类型匹配:
idx用int没问题,但如果拼接的字符串长度超过int的取值范围(比如32位系统中超过2G),会出现溢出。建议改用size_t类型,因为strlen返回的就是size_t,类型匹配更安全。
修正后的示例代码
char *strjoin(char const *s1, char const *s2) { char *result; size_t idx; if (!s1 || !s2) return NULL; if ((result = malloc(sizeof(char) * (strlen(s1) + strlen(s2) + 1))) != NULL) { idx = 0; while (*s1) result[idx++] = *s1++; while (*s2) result[idx++] = *s2++; result[idx] = '\0'; return (result); } return (NULL); }
内容的提问来源于stack exchange,提问作者morty56
相关产品推荐
相关产品推荐

