Hello World打印时后面出现乱码的个人理解
来源:6-3 字符串

taoy
2021-12-04
char string[11] = "Hello World";
- 定义字符串,必须要使用字符数组
- 11这个数字定义得毫无意义吗?因为C会自动分配11个内存给这个变量
string
,但第12个内存是什么,目前未知,但是可知的是string[12]是可以运行的,就是从string
的首地址开始的第12个地址,但类型与内容都是未知 Hello World
作为字面量,在内存中的存储是以null
(\0)结尾的,那么这里的问题是,为什么string[12]
的地址不会保存对应null
的地址?
PRINTLNF("%s", string);
string
是一个变量,地址在栈区,Hello World
是做保存在常量区的值- 当打印
string
时,先找到栈区地址值,而这个地址值是指向常量区Hello World
的地址,然后打印出地址内容 - 但
string
只被分配了11个地址,所以字面量Hello World
的结束字符null
就丢弃了,不会被打印出来 - 从而导致一个结果,就是这个字符打印后发现没有结束字符,会以为没有结束,必须要找到
null
- 这时只会在栈区这边找
null
,至于什么位置会找到,就应该是听天由命了,这也就是出现乱码的原因
这些理解对不对?
写回答
1回答
-
赞一下排版,看着非常舒服。
确实是这样的,在打印的时候要找字符串的结尾,但由于数组大小不够,导致最后的0被截掉了,所以就会一直往数组后面的内存去找。
012021-12-04
相似问题