Hello World打印时后面出现乱码的个人理解

来源:6-3 字符串

taoy

2021-12-04

char string[11] = "Hello World";

  1. 定义字符串,必须要使用字符数组
  2. 11这个数字定义得毫无意义吗?因为C会自动分配11个内存给这个变量string,但第12个内存是什么,目前未知,但是可知的是string[12]是可以运行的,就是从string的首地址开始的第12个地址,但类型与内容都是未知
  3. Hello World作为字面量,在内存中的存储是以null(\0)结尾的,那么这里的问题是,为什么string[12]的地址不会保存对应null的地址?

PRINTLNF("%s", string);

  1. string是一个变量,地址在栈区,Hello World是做保存在常量区的值
  2. 当打印string时,先找到栈区地址值,而这个地址值是指向常量区Hello World的地址,然后打印出地址内容
  3. string只被分配了11个地址,所以字面量Hello World的结束字符null就丢弃了,不会被打印出来
  4. 从而导致一个结果,就是这个字符打印后发现没有结束字符,会以为没有结束,必须要找到null
  5. 这时只会在栈区这边找null,至于什么位置会找到,就应该是听天由命了,这也就是出现乱码的原因
    这些理解对不对?
写回答

1回答

bennyhuo

2021-12-04

赞一下排版,看着非常舒服。

确实是这样的,在打印的时候要找字符串的结尾,但由于数组大小不够,导致最后的0被截掉了,所以就会一直往数组后面的内存去找。

0
1
taoy
非常感谢!
2021-12-04
共1条回复

C语言系统化精讲 重塑编程思想 打造坚实的开发基础

如果通向大牛的道路有捷径,那就是先学好C语言

2208 学习 · 853 问题

查看课程