2013-10-07 91 views
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 

这听起来很平凡,但我不确定背后的机制。为什么有差异?

+0

是否真的有可能使用指针复制值我知道它只参考一些数据的内存地址 – Shushant

+0

看来你需要阅读(或重读)一本好书C.这里是一个[列表](http:///stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)让你开始。 – RedX

+0

C中没有“自动内存”(至少不是你想要使用它的方式);你必须以某种方式分配内存,'tm * next = ...'将只为指针分配内存,*不为结构分配内存。 –

回答

1

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

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

+0

这是有道理的。所以当编译器看到一个变量的声明时,它会将它转换为那个地方的内存分配? –

+2

@JanTuroň是的,基本上你的'tm copy'和'tm * next'从栈中分配内存。 – user694733

0

随着tm* next = &(*now);nextnow将指向相同的存储位置,其中包含结构tm的数据。

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

+0

我知道。但是为什么快捷方式也不创建副本? –

+0

@JanTuroň,因为它没有那个操作。它将'now'中的值赋给'next',它是'now'指向的地址。 – Rohan

1

顾名思义,指针指向记忆中的某个地方。他们不会自己分配必要的记忆。你必须自己做。

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

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

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

tm prev = ...// get the value 
tm* now = calloc (1, sizeof (tm)); 
*now = prev; // copy by value 
+0

我知道。但我不想在这里使用动态内存管理。我只是好奇为什么快捷方式和双线形式有所不同。 –

1

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

tm copy = *now; 
tm* next = © 

第二个例子将储备任何新的存储器;相反,它将简单地将对象now指向next的地址(&)指向(*)。

tm* next = &(*now); 

他们不同的原因是C从不做任何“automagic”内存分配。你会得到你所要求的:如果你要求一个变量的记忆(如第一个例子),你会得到它;如果你不要求它,你不明白。

所以这两个例子之间的区别确实是声明一个变量(tm copy)是要求内存。

+0

现在很明显。我希望你不介意我接受user694733的回答 - 仅仅因为它是第一个看到我的观点的人。谢谢。 –