我明白,如果我有以下内容:
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 是否有可能具有相同的地址?
实际上在第一种情况下,c1
和c2
都是指向字符串文字的指针:
char* c1 = "apple";
char* c2 = "apple";
未指定c1
和c2
是否具有相同的值。换句话说,它们可能有相同的地址,也可能没有。
在第二种情况下,c1
和 c2
具有相同值的唯一可能性是当对 malloc
的两个调用都失败时,在这种情况下,它们都是空指针。否则,它们将具有不同的值。
这就是您应该检查 malloc
的返回值的原因。
>malloc 将为 c1
和 c2
返回唯一地址或 NULL,因此除非 malloc 两者都失败,否则值将不同。除了 NULL 情况之外,malloc 无法神奇地为将成为相同值的事物返回相同的地址。
但是,您当然可以说:
c2 = c1;
c2
会引用内存中与c1
相同的位置。
即使在这种情况下,c1 和 c2 是否有可能具有相同的地址?
不。
malloc()
在每次调用时分配内存块。
您连续拨打malloc()
这两个地址是不同的。
No.不可能*。每当分配内存时,它都会从"可用"内存列表中取出。然后,任何对 malloc 的后续调用都只能从"空闲"列表中保留内存。
但是当你把
char *c1 = "apple"
"苹果"被放在为整个过程保留的内存的静态部分。
之后,这取决于编译器是否要为 char *c2 提供相同的 "apple" 内存地址。
*它不应该发生,而且是错误的。但是脱离标准C/C++的上下文,并且可能对于其他编程语言,没有什么能阻止编译器(这是一个与其他程序一样的程序)这样做。