0

让我们有一些指向结构的指针,例如tm

time_t timestamp = time(NULL);
tm* now = localtime(&timestamp);

要在自动内存中创建指向副本的指针,可以使用按值复制:

tm copy = *now;
tm* next = ©
// next points to a copy in memory

但是为什么这个快捷方式不会将值复制到新的内存块?(gcc 编译器)

tm* next = &(*now);
// next points to the address of now

这听起来可能微不足道,但我不确定背后的机制。为什么有区别?

4

4 回答 4

1

=仅用于将数据从一个内存位置复制到另一个内存位置。&只给你一个变量的地址。*只取消引用一个变量。这些都不会以任何形式分配内存,也不会创建任何临时变量。

所有内存分配都必须在 C 中明确说明。这里没有区别

于 2013-10-07T08:18:05.177 回答
1

指针,顾名思义,指向内存中的某个位置。它们不会自行分配必要的内存。你必须自己做。

在您的代码中,指针next实际上指向内存中的位置,now即位于的位置。如果通过指针修改任何值,实际上是在修改原始结构。这就是指针的工作原理。

如果要分配内存,请使用malloccalloc。但请记住,这样分配的内存必须是freed。

一旦分配了内存,就可以按值复制它。

tm prev = ...// get the value
tm* now = calloc (1, sizeof (tm));
*now = prev; // copy by value
于 2013-10-07T08:17:22.110 回答
1

您的第一个示例将在堆栈上为变量保留内存copy。然后它将内容复制now到新的内存位置,最后next指向该内存位置。

tm copy = *now;
tm* next = ©

第二个例子不会保留任何新的内存;相反,它将简单地将对象指向next 的地址 ( ) 分配给 ( )。&now*

tm* next = &(*now);

它们不同的原因是C从不进行任何“自动”内存分配。你得到你所要求的:如果你要求一个变量的内存(如第一个例子)你得到它;如果你不要求它,你就不会得到它。

所以这两个例子之间的区别实际上是声明一个变量 ( tm copy) 是在请求​​内存。

于 2013-10-07T08:31:54.737 回答
0

tm* next = &(*now);两者都next将指向now包含结构数据的相同内存位置tm

没有分配新的内存next来指向。

于 2013-10-07T08:12:50.133 回答