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

C 两个内存分配示例之间的差异?,c,malloc,C,Malloc,据我了解, 例1 例2 在例1中, malloc创建一个内存空间并返回分配内存的第一个地址块。 所以cPtr在堆内获得一个任意地址 在示例2的第2行中,cPtr指向c。所以cPtr的地址是c 此时,当您执行示例2的第3行时, cPtr的价值是什么? 它是否获得了我在示例1中提到的任意内存地址? 或者,它是否保留了c的地址并创建了一个空格 它是否获得了我在示例1中提到的任意内存地址 对。该行只覆盖了先前的cPtr值 或者,它是否保留了c的地址并创建了一个空格 不,它没有“保存”任何东西cPtr被m

据我了解,

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

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

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

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

对。该行只覆盖了先前的
cPtr

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

不,它没有“保存”任何东西
cPtr
malloc()
调用的返回值覆盖,该调用指向某个内存块,与第一个示例相同

第二个示例的第1行和第2行基本上都不是ops

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

对。该行只覆盖了先前的
cPtr

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

不,它没有“保存”任何东西
cPtr
malloc()
调用的返回值覆盖,该调用指向某个内存块,与第一个示例相同


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

malloc
返回的值可以成功地
初始化
更改指针的值。
初始化发生在示例1中,更改cPtr的值发生在示例2中

这是两者之间唯一的区别。

malloc
返回的值可以成功地
初始化
更改
指针的值。
初始化发生在示例1中,更改cPtr的值发生在示例2中

这是两者之间的唯一区别。

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


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

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



换句话说,两个示例都是100%等效的,第二个示例有两行额外的完全不重要的(“死”)代码。

在C程序中不需要强制转换malloc的返回值。例如2,对吗?示例1怎么样?不,您永远不需要在C程序中强制转换
malloc
的返回值。@user1798211您不能强制转换
malloc()
的返回值。包括演员阵容是错误的。你的问题对我来说就像
i=5
i=j
那么什么是
i
?您不需要在C程序中强制转换
malloc
的返回值。例如2,对吗?示例1怎么样?不,您永远不需要在C程序中强制转换
malloc
的返回值。@user1798211您不能强制转换
malloc()
的返回值。包括演员阵容是错误的。你的问题对我来说就像
i=5
i=j
那么什么是
i
?如果我想将地址分配到
c
的地址,那么我该怎么做?你不能这样做。可能已经有别的东西了<例如,代码>cPtr本身。看起来像第1行和第2行是没有意义的,对吗?我想使用c作为分配内存的第一个字符。在第3行后面加上“char c=*cPtr”可以解决问题吗?你想要的是相反的:“*cPtr=c”即:将c中的字符复制到cPtr指向的区域的第一个字符中。不,这样不行。您只需将一个未知值赋给
c
。如果你想使用指针,你必须使用指针。如果我想把地址分配给
c
的地址,那我该怎么做?你不能这样做。可能已经有别的东西了<例如,代码>cPtr本身。看起来像第1行和第2行是没有意义的,对吗?我想使用c作为分配内存的第一个字符。在第3行后面加上“char c=*cPtr”可以解决问题吗?你想要的是相反的:“*cPtr=c”即:将c中的字符复制到cPtr指向的区域的第一个字符中。不,这样不行。您只需将一个未知值赋给
c
。如果你想使用指针,你必须使用指针。第1行的效果不会被丢弃。标识符
c
保留在范围内,并且它引用的对象在块的执行过程中继续存在。@Eric Postdischil:我指的是这些行对特定问题上下文的影响。问题是代码对
cPtr
值的影响。这正是我的回答所要解决的问题。在这种情况下,名为
c
的附加对象的存在与示例2的源代码可能会在硬盘上占用更多空间这一事实具有同等的相关性。鉴于OP的混乱,您可能会让他们认为
c
是由第3行发布的。第1行的效果不会被丢弃。标识符
c
保留在范围内,并且它引用的对象在块执行期间继续存在。@Eric Postdischil:我指的是这些行对上下文的影响
cPtr = (char*)malloc(100);
1 char c = 0;
2 char* cPtr = &c
3 cPtr = (char*)malloc(100);