让我们有一些指向结构的指针,比如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
这可能听起来微不足道,但我不确定背后的机制。为什么会有区别?
答案 0 :(得分:1)
在您的代码中,指针next
实际上指向内存中的位置,now
所在的位置。如果通过指针修改任何值,则实际上是在修改原始结构。这就是指针的工作方式。
如果您想分配内存,请使用malloc
或calloc
。但请记住,像这样分配的内存必须是free
d。
分配内存后,您可以按值复制它。
tm prev = ...// get the value
tm* now = calloc (1, sizeof (tm));
*now = prev; // copy by value
答案 1 :(得分:1)
=
仅用于将数据从一个内存位置复制到另一个内存位置。 &
仅为您提供变量的地址。 *
仅取消引用变量。这些都不会以任何形式分配内存,也不会创建任何临时变量。
所有内存分配必须在C中明确说明。此处没有差异。
答案 2 :(得分:1)
您的第一个示例将在变量copy
的堆栈上保留内存。
然后它会将now
的内容复制到新的内存位置,最后将next
指向该内存位置。
tm copy = *now;
tm* next = ©
第二个示例将不保留任何新内存;相反,它只会将next
对象&
的地址(now
)分配给(*
)。
tm* next = &(*now);
他们不同的原因是C从不做任何“自动”内存分配。 你得到你要求的东西:如果你要求变量的内存(如第一个例子中所示),你得到它;如果你不要求它,你就不会得到它。
因此,两个示例之间的区别实际上是声明变量(tm copy
)要求内存。
答案 3 :(得分:0)
使用tm* next = &(*now);
,next
和now
都会指向包含结构tm
数据的相同内存位置。
没有为next
分配新的内存来指向。