C 两个内存分配示例之间的差异?
据我了解, 例1 例2 在例1中, malloc创建一个内存空间并返回分配内存的第一个地址块。 所以cPtr在堆内获得一个任意地址 在示例2的第2行中,cPtr指向c。所以cPtr的地址是c 此时,当您执行示例2的第3行时, cPtr的价值是什么? 它是否获得了我在示例1中提到的任意内存地址? 或者,它是否保留了c的地址并创建了一个空格 它是否获得了我在示例1中提到的任意内存地址 对。该行只覆盖了先前的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
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);