我明白如果我有以下内容:
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是否可能具有相同的地址?
答案 0 :(得分:7)
实际上,在第一种情况下c1
和c2
都是字符串文字的指针:
char* c1 = "apple";
char* c2 = "apple";
c1
和c2
是否具有相同的值是未指定的。换句话说,他们可能或可能没有相同的地址。
在第二种情况下,c1
和c2
具有相同值的唯一可能性是当对malloc
的两次调用都失败时,在这种情况下它们都是空指针。否则,它们将具有不同的值。
这就是你应该检查malloc
的返回值的原因。
答案 1 :(得分:5)
malloc将返回c1
和c2
的唯一地址或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 ++和可能的其他编程语言的背景下,没有什么能阻止编译器(这是一个像其他任何其他程序一样的程序)。