void foo()
{
char *c1 = "abc";
static char *c2 = "abc";
char *c3 = malloc(10);
strcpy(c3, "abc");
}
Run Code Online (Sandbox Code Playgroud)
在foo,我假设:
c1 是一个本地指针,所以它应该在堆栈上;
c2 是一个静态指针,它应该在堆上;
c3 在堆上.
根据我的假设,我绘制了一个关于指针和他们指向的字符串文字的图表,
stack rodata heap
| | | | | |
| c1 |------>| "abc" |<--------| c2 |
| .. | | | \ | .. |
| | | | `------| c3 |
| | | | | |
Run Code Online (Sandbox Code Playgroud)
我的假设和图表对吗?
不过,我不太明白为什么要c3在堆上呢?c3只是一个char *,只是指向一个地址(位于堆上)不在c3堆上,对吧?
你的假设不对.c3不指向文字"abc".它指向malloc您复制的内存返回.
此外,c1与c3均处于自动存储(在栈).它们是函数范围的指针.c3但是,对象指向动态存储(堆),但c3本身不是.
更正确的图表是:
stack rodata heap global
| | | | | | | |
| c1 |------>| "abc" |<--------------------| c2 |
| c3 |------------------------>| "abc" |
| | | | | |
| | | | | |
Run Code Online (Sandbox Code Playgroud)