C++结构体字符数组输出异常问题求助
结构体char数组cout输出异常的原因及解决办法
核心原因:C风格字符串缺少终止符'\0'
cout输出char[]时,默认按C风格字符串处理,必须以'\0'(空字符)作为结束标记。如果数组末尾没有这个标记,它会持续读取内存中的后续字节,直到遇到某个'\0'为止——这就是refDossier连带显示refDossier62内容的直接原因。strncpy函数有个关键特性:当源字符串长度≥目标数组长度时,它只会复制指定数量的字符,不会自动在目标数组末尾添加'\0'。比如refDossier是12字节的数组,如果源字符串长度刚好是12,strncpy填满数组后不会补终止符,导致数组没有结束标记。
逐个字符输出正常的原因
逐个字符输出时,你是严格按照数组的定义长度(比如refDossier取前12个字符)遍历输出,不依赖'\0'判断结束,所以不会越界读取相邻数组的内容。
可行的解决办法
- 手动补充终止符:调用
strncpy时,预留一个字节的位置给'\0',之后手动添加:// 给refDossier复制内容,留1个位置放终止符 strncpy(foo.refDossier, source_str, 11); foo.refDossier[11] = '\0'; // 给refDossier62做同样处理 strncpy(foo.refDossier62, source_str62, 8); foo.refDossier62[8] = '\0'; - 改用
std::string替代C风格数组:std::string会自动管理内存和终止符,彻底避免这类手动处理的问题,代码更简洁安全:struct Foo { std::string refDossier; std::string refDossier62; };
内容的提问来源于stack exchange,提问作者Jocelyn
相关产品推荐
相关产品推荐

