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

前端之家收集整理的这篇文章主要介绍了本地指针,`static`指针和`malloc`指针前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
void foo()
{
    char *c1 = "abc";
    static char *c2 = "abc";
    char *c3 = malloc(10);
    strcpy(c3,"abc");
}

在foo中,我假设:

c1是一个本地指针,所以它应该在堆栈上;

c2是一个静态指针,它应该在堆上;

c3在堆上.

根据我的假设,我绘制了一个关于指针和他们指向的字符串文字的图表,

stack         rodata           heap
|    |       |       |         |    |
| c1 |------>| "abc" |<--------| c2 |
| .. |       |       | \       | .. |
|    |       |       |  `------| c3 |
|    |       |       |         |    |

我的假设和图表对吗?

不过,我不太明白为什么c3应该在堆上? c3只是一个char *,只是指向一个地址(位于堆上)不会在堆上创建c3,对吧?

解决方法

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

此外,c1和c3都在自动存储中(在堆栈上).它们是函数范围的指针.但是,c3指向的对象是动态存储(堆),而c3本身则不是.

更正确的图表是:

stack         rodata           heap        global
|    |       |       |         |       |   |      |
| c1 |------>| "abc" |<--------------------|  c2  |
| c3 |------------------------>| "abc" |
|    |       |       |         |       |
|    |       |       |         |       |

猜你在找的C&C++相关文章