C 通过指针和地址复制对象

C 通过指针和地址复制对象,c,pointers,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

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)
下一个
和现在
都将指向包含结构
tm
数据的相同内存位置

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

使用
tm*next=&(*now)
下一个
和现在
都将指向包含结构
tm
数据的相同内存位置

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

使用
tm*next=&(*now)
下一个
和现在
都将指向包含结构
tm
数据的相同内存位置

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

使用
tm*next=&(*now)
下一个
和现在
都将指向包含结构
tm
数据的相同内存位置


没有为要指向的
下一个
分配新内存。

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

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

如果要分配内存,请使用
malloc
calloc
。但是请记住,这样分配的内存必须是
空闲的
d

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

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

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

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

如果要分配内存,请使用
malloc
calloc
。但是请记住,这样分配的内存必须是
空闲的
d

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

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

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

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

如果要分配内存,请使用
malloc
calloc
。但是请记住,这样分配的内存必须是
空闲的
d

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

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

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

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

如果要分配内存,请使用
malloc
calloc
。但是请记住,这样分配的内存必须是
空闲的
d

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

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

=
仅用于将数据从一个内存位置复制到另一个内存位置<代码>&
仅提供变量的地址<代码>*
仅解除对变量的引用。所有这些都不会以任何形式分配内存,也不会创建任何临时变量


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

=
仅用于将数据从一个内存位置复制到另一个内存位置<代码>&
仅提供变量的地址<代码>*
仅解除对变量的引用。所有这些都不会以任何形式分配内存,也不会创建任何临时变量


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

=
仅用于将数据从一个内存位置复制到另一个内存位置<代码>&
仅提供变量的地址<代码>*
仅解除对变量的引用。所有这些都不会以任何形式分配内存,也不会创建任何临时变量


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

=
仅用于将数据从一个内存位置复制到另一个内存位置<代码>&
仅提供变量的地址<代码>*
仅解除对变量的引用。所有这些都不会以任何形式分配内存,也不会创建任何临时变量


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

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

tm copy = *now;
tm* next = &copy;
第二个示例将不保留任何新内存;相反,它只需将对象的地址(
&
)指定给(
*
)即可

它们之所以不同,是因为C从不进行任何“自动逻辑”内存分配。 你得到了你想要的:如果你想要一个变量的内存(如