通过指针和地址复制对象

标签 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

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

最佳答案

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

tm copy = *now;
tm* next = ©

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

tm* next = &(*now);

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

所以这两个示例之间的区别实际上是声明一个变量(tm copy)需要内存。

关于通过指针和地址复制对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19219734/

相关文章:

c - 从 C 函数返回空指针,比较段错误

c++ - 尝试在 C++ 中创建动态数组时抛出内存错误

c - 理解下面一行

algorithm - 反转替代元素并附加到列表末尾

c - c中的空函数

c - 什么是评价?

C - 传递分配的指针并在单独的函数中使用 realloc

c - 我的 C 函数从 stdin 读取并解析数据以存储在结构体的成员中。每次调用时如何读取输入的下一部分?

c - 从文件中的字符串获取字符串长度

c - C 在外部声明一个非常量变量 'const' 是否合法?