首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >本地指针、`static`指针和`malloc`指针

本地指针、`static`指针和`malloc`指针
EN

Stack Overflow用户
提问于 2012-02-28 20:24:43
回答 6查看 1.6K关注 0票数 6
代码语言:javascript
复制
void foo()
{
    char *c1 = "abc";
    static char *c2 = "abc";
    char *c3 = malloc(10);
    strcpy(c3, "abc");
}

foo中,我假设:

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

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

c3在堆上。

根据我的假设,我画了一个关于指针和它们所指向的字符串文字的图,

代码语言:javascript
复制
 stack         rodata           heap
|    |       |       |         |    |
| c1 |------>| "abc" |<--------| c2 |
| .. |       |       | \       | .. |
|    |       |       |  `------| c3 |
|    |       |       |         |    |

我的假设和图表对吗?

尽管如此,我还是不太明白为什么c3应该在堆上?c3只是一个char *,只是指向一个地址(位于堆上)并不会使c3在堆上,对吧?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-02-28 20:27:32

你的假设是不正确的。c3未指向文字"abc"。它指向malloc返回的内存,您可以将其复制进去。

此外,c1c3都在自动存储中(在堆栈上)。它们是函数作用域中的指针。然而,c3指向的对象在动态存储(堆)中,而c3本身不在动态存储中。

更正确的图表是:

代码语言:javascript
复制
 stack         rodata           heap        global
|    |       |       |         |       |   |      |
| c1 |------>| "abc" |<--------------------|  c2  |
| c3 |------------------------>| "abc" |
|    |       |       |         |       |
|    |       |       |         |       |
票数 9
EN

Stack Overflow用户

发布于 2012-02-28 20:28:45

实际的变量c3位于堆栈上,因为它是一个局部变量。但是,因为指针是用malloc创建的,所以c3指向的数据将在堆上。

请注意,您必须在函数返回之前释放c3指向的内容,否则应用程序中将出现内存泄漏,这绝不是一个好主意。

票数 4
EN

Stack Overflow用户

发布于 2012-02-28 20:35:53

c1c3是具有自动存储持续时间的指针。这两个指针位于foo()函数的堆栈中。他们所指的是另一回事。

c2是静态的,并且驻留在其他地方(通常不是堆,而是在整个程序持续时间内有效的其他数据部分)。

c1c2都指向字符串文字"abc“。通常,字符串字面值被放在只读部分中,并且相似的字符串被合并,以便c1c2指向相同的内存。

c3指向由malloc()分配的内存,这是通常称为“堆”的内存。然后将字符串"abc“复制到堆上的内存中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9481849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档