C语言 两个内存分配示例之间的差异



在我的理解中,

例1

cPtr = (char*)malloc(100);

示例2

1 char c = 0;
2 char* cPtr = &c
3 cPtr = (char*)malloc(100);

在示例 1 中,malloc 创建一个内存空间,并返回分配内存的第一个地址块。所以cPtr在堆内得到一个任意地址。

在示例 2 的第 2 行中,cPtr 指向 c。所以cPtr的地址是c。

此时,当您执行示例 2 的第 3 行时,cPTR 的价值是什么?它是否像我在示例 1 中提到的那样获得任意内存地址?或者,它是否保留 c 的地址并创建一个空格?

它是否像我在示例 1 中提到的那样获得任意内存地址?

是的。 该行只是覆盖了 cPtr 的先前值。

或者,它是否保留 c 的地址并创建一个空格?

不,它不会"保留"任何东西。 cPtrmalloc() 调用的返回值覆盖,该值指向某个内存块,与第一个示例相同。

第二个示例的第 1 行和第 2 行本质上是无操作。

malloc返回可以成功initializechange指针值的值。
初始化在示例 1 中进行,cPtr 的值更改在示例 2 中进行。
这是这两者之间的唯一区别。

关于 cPtr 的值,在第二个示例中,第 3 行完全丢弃了第 1 行和第 2 行的所有效果。 即malloc返回的值只是覆盖了 cPtr 中的先前值。因此,在第二个示例中,第 1 行和第 2 行对代码行为完全没有影响。

换句话说,这两个示例都是 100% 等效的,第二个示例具有两行完全无关紧要("死"(代码的额外行。

最新更新