# 实验
```c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[]) {
int a[3];
char b[3];
char *c = (char *) malloc(sizeof(char) * 3);
char *d = "hello world";
printf("a: %p\n", a); // 栈
printf("b: %p\n", b); // 栈
printf("c: %p\n", c); // 堆
printf("d: %p\n", d); // 只读区(常量区)
printf("&d: %p\n", &d); // d 是指针,本身的地址是在栈上
printf("main: %p\n", main); // 代码区
return 0;
}
```
输出
```
a: 0x7fff5e71fa8c
b: 0x7fff5e71fa75
c: 0x7faa8ce00150
d: 0x1014e0f76
&d: 0x7fff5e71fa60
main: 0x1014e0e50
```
为什么`&d`是在栈上,而`d`是在只读区呢?
`d`里存的是字符串的首地址。具体参考[字符串的初始化原理](https://mengkang.net/993.html#blog-title-8)