让我们有一些指向结构的指针,比如 tm
:
time_t timestamp = time(NULL);
tm* now = localtime(×tamp);
要在自动内存中创建一个指向副本的指针,可以使用按值复制:
tm copy = *now;
tm* next = ©
// next points to a copy in memory
但为什么这个快捷方式不将值复制到新的内存块? (gcc 编译器)
tm* next = &(*now);
// next points to the address of now
这听起来可能微不足道,但我不确定背后的机制。为什么会有差异?
最佳答案
您的第一个示例将在堆栈上为变量copy
保留内存。
然后它将 now
的内容复制到新的内存位置,最后让 next
指向该内存位置。
tm copy = *now;
tm* next = ©
第二个例子将不保留任何新内存;相反,它将简单地分配 next
对象 now
指向 (*
) 的地址 (&
)。
tm* next = &(*now);
它们不同的原因是 C 从不进行任何“自动”内存分配。 你得到了你所要求的:如果你为一个变量请求内存(如第一个例子),你就得到了它;如果你不要求它,你就不会得到它。
所以这两个示例之间的区别实际上是声明一个变量(tm copy
)需要内存。
关于通过指针和地址复制对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19219734/