通过指针和地址复制对象

时间:2013-10-07 08:04:54

标签: c pointers

让我们有一些指向结构的指针,比如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 个答案:

答案 0 :(得分:1)

顾名思义,指针指向记忆中的某个位置。他们没有自己分配必要的内存。你必须自己做。

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

如果您想分配内存,请使用malloccalloc。但请记住,像这样分配的内存必须是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);nextnow都会指向包含结构tm数据的相同内存位置。

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