-1

我明白,如果我有以下情况:

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

4 回答 4

7

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

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

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


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

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

于 2013-11-09T16:39:15.847 回答
5

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

但是,您当然可以说:

c2 = c1;

并且c2将在内存中引用与c1.

于 2013-11-09T16:38:04.290 回答
1

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

但是当你放

char *c1 = "apple"

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

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

于 2013-11-09T16:43:00.700 回答
1

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

不。

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

你已经malloc()连续调用了这两个地址是不同的。

于 2013-11-09T16:39:34.493 回答