即使使用 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 是否有可能具有相同的地址?

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

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

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


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

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

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

但是,您当然可以说:

c2 = c1;

c2会引用内存中与c1相同的位置。

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

不。

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

您连续拨打malloc()这两个地址是不同的。

No.不可能*。每当分配内存时,它都会从"可用"内存列表中取出。然后,任何对 malloc 的后续调用都只能从"空闲"列表中保留内存。

但是当你把

char *c1 = "apple"

"苹果"被放在为整个过程保留的内存的静态部分。
之后,这取决于编译器是否要为 char *c2 提供相同的 "apple" 内存地址。

*它不应该发生,而且是错误的。但是脱离标准C/C++的上下文,并且可能对于其他编程语言,没有什么能阻止编译器(这是一个与其他程序一样的程序)这样做。

相关内容

  • 没有找到相关文章

最新更新