内存分配 以及 是否可写
对于char* s = "hello"
系统会创建两个对象:
- 一个是只读的数组,包括'h', 'e', 'l', 'l', 'o', '\0',该数组是无名的,且存储在静态存储区,生命周期为程序的整个生命期。
- 一个是指向char类型的指针,称作s,s初始化为上面的只读数组的第一个元素的地址。
因此如果执行s[0] = 'w'; 会导致runtime error,因为尝试去写一个只读区域。
对于char s[] = "hello"
系统创建了一个包含6个元素的字符数组,包括'h', 'e', 'l', 'l', 'o', '\0'。该数组的生命周期取决于数组对象声明的地方。如果在函数内声明,则生命周期为函数期间,在栈上分配内存。如果是在函数外声明,则存储在全局数据区,当程序启动时从可执行文件加载到可写的内存区域中。
如果执行s[0] = 'w'; 是可行的,操作的并不是只读区域。