即使使用malloc,两个char *也可以拥有相同的内存地址吗?

时间:2013-11-09 16:35:13

标签: c++ c pointers char malloc

我明白如果我有以下内容:

char* c1 = "apple";
char* c2 = "apple";

然后这两个char *可以具有完全相同的内存地址。 但如果我有以下内容怎么办?

char* c1 = (char*)malloc(sizeof(char)*10);
memset(c1, 0, 10);
c1[0]='a';c1[0]='p';c1[0]='p';c1[0]='l';c1[0]='e';
char* c2 = (char*)malloc(sizeof(char)*10);
memset(c1, 0, 10);
c2[0]='a';c2[0]='p';c2[0]='p';c2[0]='l';c2[0]='e';

即使在这种情况下,c1和c2是否可能具有相同的地址?

4 个答案:

答案 0 :(得分:7)

实际上,在第一种情况下c1c2都是字符串文字的指针:

char* c1 = "apple";
char* c2 = "apple";

c1c2是否具有相同的值是未指定的。换句话说,他们可能或可能没有相同的地址。


在第二种情况下,c1c2具有相同值的唯一可能性是当对malloc的两次调用都失败时,在这种情况下它们都是空指针。否则,它们将具有不同的值。

这就是你应该检查malloc的返回值的原因。

答案 1 :(得分:5)

malloc将返回c1c2的唯一地址或NULL,因此除非malloc两者都失败,否则值将不同。除了NULL情况之外,malloc没有办法神奇地为相同的值返回相同的地址。

然而,你当然可以说:

c2 = c1;

c2会将内容中的相同位置称为c1

答案 2 :(得分:1)

  

即使在这种情况下,c1和c2是否可能具有相同的地址?

没有。

malloc()在每次调用时分配内存块。

您已连续致电malloc()这两个地址不同。

答案 3 :(得分:1)

没有。不可能*。无论何时分配内存,它都会从“免费”内存列表中取出。然后对malloc的任何后续调用只能从“free”列表中保留内存。

但是当你把

char *c1 = "apple"

“apple”被放入为整个过程保留的内存的静态部分 之后,它依赖于编译器是否要为char * c2提供相同的“apple”内存地址。

* 它不应该发生,而且是错误的。但是,在标准C / C ++和可能的其他编程语言的背景下,没有什么能阻止编译器(这是一个像其他任何其他程序一样的程序)。