C语言中printf无法正确输出malloc构造的字符串是什么原因
问题原因分析
- 核心错误是数组的类型声明不匹配:你将
myArray声明为int *类型,但实际用来存储char类型的字符数据,与printf("%s")的参数要求完全不符。 - 为什么
printf("%s")仅输出1个*:printf("%s")要求输入char *类型的、以\0结尾的字符数组首地址,处理时会按1字节的步长依次读取内存内容直到遇到\0。而int类型在大多数系统中占4字节,你给myArray[0]赋值'*'时,实际是将首地址开始的4字节内容设置为0x0000002A(小端架构下存储为0x2A 0x00 0x00 0x00),%s读取完第一个字节的*后,第二个字节就是0x00,会被识别为字符串终止符,所以仅输出单个*。 - 为什么逐字符打印看起来正常:你用
%c输出时,是直接将myArray[i]的int值的低8位作为ASCII码打印,你循环赋值时每个myArray[index]的int值都是'*'对应的ASCII码0x2A,所以低8位都是*,打印出来自然是8个*。但这本质属于未定义行为,你申请的内存空间仅9字节,根本不足以支撑8个int元素的存储,赋值过程已经出现了越界访问。
修复方案
直接将myArray的声明改为char *类型,符合字符数组的使用预期即可:
char *myArray = NULL; // 仅需把原声明的int*改为char*
修改后printf("%s", myArray)就可以正常输出8个*。
额外优化建议
- 调用
malloc后需要判断返回值是否为NULL,避免内存分配失败导致的崩溃 - 动态申请的内存使用完成后需要调用
free(myArray)释放,防止内存泄漏
内容的提问来源于stack exchange,提问作者Nono Nunu
相关产品推荐
相关产品推荐

