c语言的烫烫烫烫烫??

当初学习C语言时,对于一些特殊的打印输出可能会感到困惑,比如会出现一堆乱码烫烫烫的情况。其实这是因为在C语言中,对于字符类型和数字类型之间的隐式转换可能会导致打印输出的结果不符合预期。这并不意味着程序员"烫",而是因为数据类型转换导致的打印错误。在编程过程中,对于数据类型的处理需谨慎,避免出现这种问题。希望这能帮助解答你的疑惑。

就比如这个代码

复制代码
#include<stdio.h>

int main()
{
	char ch[] = { 'a','b','c' };
	printf("%s", ch);
	return 0;
}

很简单的一个代码,如果刚开始学,我们可能会觉得会打印abc;

但是学的比较深的同学就会里面反应过来这个代码其实是有问题的,因为在字符数组里面,最后一位没有存储''\0'',所以在打印的时候不会遇见特殊结束标识符,不会停止打印;

那么当我们运行代码,看看打印效果

果真会出现了烫烫烫烫烫。

对应打印其实是打印内存存储的数据,那么我们对应的就需要查找内存出书信息,

还有一点如果运行多次会发现每一次的打印都是不一样的。这个问题是跟结束条件''\0''有关;

首先我们先解决为什么每次打印我们看到结果不一样问题:正如上图所示我们看到后面恰好有初始化为0的地方,所以打印到对应的哪里,然而每次初始化又有可能不同,自然就会结束 所以每次打印结果可能不同;

那么我们再来解决为什么打印烫烫烫烫烫,在Visual Studio中,未初始化的栈空间用0xCC填充,而未初始化的堆空间用0xCD填充。因为abc是存储在栈中,所以后面的内存中,内存会初始化为cc。而0xCCCC和0xCDCD在中文GB2312编码中分别对应"烫"字和"屯"字。如果一个字符串没有结束符'\0',输出时就会打印出未初始化的栈或堆空间的内容



这样设计的目的:

这样做的好处是这些值都很大,作为指针是不可能的(而且 32 位系统中指针很少是奇数值,在有些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容易辨认,因此这很有利于在 Debug 版中发现 Release 版才会遇到的错误

对于本代码如何修改避免:直接添加结束表示符

其实有一些文档打开是乱码跟这个道理差不多,只是没有用二进制读取方式打开;并不是文件本身有问题~~~

相关推荐
米糕闯编程20 分钟前
鱼香ros2(五)用C++编写节点
c++·ros2·cmakelists·鱼香
xiangyun612 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun612 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
白远山3 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
fpcc4 小时前
计算机原理—构建过程中的分段分析
c++
xxwxx__4 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++
Logic1014 小时前
C语言/数据结构数组题解:数字列表加一(Plus One)——进位处理与数组扩展
c语言·数据结构·模拟·数组·时间复杂度·算法题·进位
Escalating_xu4 小时前
【C语言常见概念】从第一行代码到字符串结束标志:一次打通编译、main、ASCII、转义字符与注释
c语言·c++
DevRay4 小时前
Java 21虚拟线程深度实战:告别线程池焦虑,百万并发吞吐量直接翻倍(原理+代码+避坑)
java·开发语言
Navigator_Z4 小时前
LeetCode //C - 1250. Check If It Is a Good Array
c语言·算法·leetcode