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在堆上,对吧?
发布于 2012-02-28 20:27:32
你的假设是不正确的。c3未指向文字"abc"。它指向malloc返回的内存,您可以将其复制进去。
此外,c1和c3都在自动存储中(在堆栈上)。它们是函数作用域中的指针。然而,c3指向的对象在动态存储(堆)中,而c3本身不在动态存储中。
更正确的图表是:
stack rodata heap global
| | | | | | | |
| c1 |------>| "abc" |<--------------------| c2 |
| c3 |------------------------>| "abc" |
| | | | | |
| | | | | |发布于 2012-02-28 20:28:45
实际的变量c3位于堆栈上,因为它是一个局部变量。但是,因为指针是用malloc创建的,所以c3指向的数据将在堆上。
请注意,您必须在函数返回之前释放c3指向的内容,否则应用程序中将出现内存泄漏,这绝不是一个好主意。
发布于 2012-02-28 20:35:53
c1和c3是具有自动存储持续时间的指针。这两个指针位于foo()函数的堆栈中。他们所指的是另一回事。
c2是静态的,并且驻留在其他地方(通常不是堆,而是在整个程序持续时间内有效的其他数据部分)。
c1和c2都指向字符串文字"abc“。通常,字符串字面值被放在只读部分中,并且相似的字符串被合并,以便c1和c2指向相同的内存。
c3指向由malloc()分配的内存,这是通常称为“堆”的内存。然后将字符串"abc“复制到堆上的内存中。
https://stackoverflow.com/questions/9481849
复制相似问题