每个字符串在内存中都占用一段连续的存储空间。并有唯一确定的首地址。因此可以将字符串的首地址赋值给字符指针。则可以让字符指针指向一个字符串。对于字符串常量而言,字符串常量本身就代表他常量存储区的首地址。
运行的时候,就加载了。是无法更改的,在我们的内存中代码段中的。栈内存和堆内存才能更改。
str2 指向的是代码段,存储于内存中,无法更改。否则为segmentation fault
虽然很想回答,但是感觉你可以去看视频下方的回答会更好,虽然很多人都回答了一部分比较零碎 但是整合一下几乎就差不多是视频知识点的总结了
我感觉也应该是在数据段
不对,str2中存储的是地址没错,但str2其本身是指针,所以输出str2是输出指针中存放的地址所指向的值,指针本身的特性。视频中一直展示的*str2才能访问地址所存值、str2访问的是地址是在调试环境下的情况,并不是程序本身运行效果,不要被迷惑了
str2只是个常量,取地址打印(&str2)才是打印出地址。整形数跟字符类型的&都是一样的
==为什么不会被覆盖,不过你要想避免被覆盖就把数组分为全局和局部的,两个都是全局的肯定会被后者覆盖,前者全局后者局部的,在局部使用的数组不会被覆盖。
str2="world" 这样并不是把world这几个字符复制到str2所指的区域,字符串字面量做右值时会转换为指向首字符的指针,所以这语句是把str2指向“world”这个字符串所在的位置。需要复制字符串应使用LS说的strcpy函数。
一般程序会把字符串字面量放到只读数据段中(无法被修改),所以后续通过str2来修改这些内容会引起"段错误"。
你代码的另一个问题是,在你给str2第二次赋值后就丢掉了前一次分配的指针,导致无法回收那段内存,引起内存泄漏。
是在代码段,因为是字符串常量,只需要读,不需要修改,代码段不能修改,只能读取,放在代码段可以节约数据段空间,这是编译器优化的
str 比 str2 高 0x40-0x38 = 8字节,str占用6个字节,可以容纳开。
str3 比 str 高 0x50-0x40 = 16字节,str3占用10个字节,也可以容乃开。
一般变量的地址起始要求是2或4的倍数,所以为了对齐,变量之间会有额外的空当。