本地指针,`static`指针和`malloc`指针

Alc*_*ott 6 c pointers

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堆上,对吧?

Luc*_*ore 9

你的假设不对.c3不指向文字"abc".它指向malloc您复制的内存返回.

此外,c1c3均处于自动存储(在栈).它们是函数范围的指针.c3但是,对象指向动态存储(堆),但c3本身不是.

更正确的图表是:

 stack         rodata           heap        global
|    |       |       |         |       |   |      |
| c1 |------>| "abc" |<--------------------|  c2  |
| c3 |------------------------>| "abc" |
|    |       |       |         |       |
|    |       |       |         |       |
Run Code Online (Sandbox Code Playgroud)