1. 字符串本质是地址常量
代码中的字符串"Hello world" 的本质是:存储该字符串的某一段内存的首地址,是一个地址常量。
- 因为是常量,所以不能被赋值,比如:"Hello world" = NULL; 是非法的
- 因为是一个地址,所以可以赋值给一个指针变量,char *p = "Hello world"
2. 在内存中的存储区域
- 一段字符串,比如说"Hello world",它其实存在内存的 .rodata段 / 只读数据段。
- 只读数据段与.data段 / 全局存储段(static定义的变量也在这里)紧挨着。
- 对于一个数组来说,比如char a[100] 这个 a 其实也是首地址常量。
- 所以我们也可以把字符串当做数组来使用:"Hello world"[1] == 'e'
- 对于全局变量,内容为0的变量存储在.bss段,和.data段紧挨着。
- 主函数中的局部变量存在栈段(stack segment)。所谓段错误:Segmentation fault,其实就是访问了非法的内存段。ulimit -s 可以看到操作系统对栈段(stack)内存的限制,单位为KB。例如本机显示为8192,表示栈段最多容纳8M,大概8百万个字节。
- 动态申请的内存在堆段(heap),malloc返回动态申请的内存的首地址,又是一个地址常量。