在我的理解中,
例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 的地址并创建一个空格?
不,它不会"保留"任何东西。 cPtr
被 malloc()
调用的返回值覆盖,该值指向某个内存块,与第一个示例相同。
第二个示例的第 1 行和第 2 行本质上是无操作。
malloc
返回可以成功initialize
或change
指针值的值。
初始化在示例 1 中进行,cPtr 的值更改在示例 2 中进行。
这是这两者之间的唯一区别。
关于 cPtr
的值,在第二个示例中,第 3 行完全丢弃了第 1 行和第 2 行的所有效果。 即malloc
返回的值只是覆盖了 cPtr
中的先前值。因此,在第二个示例中,第 1 行和第 2 行对代码行为完全没有影响。
换句话说,这两个示例都是 100% 等效的,第二个示例具有两行完全无关紧要("死"(代码的额外行。