【问题标题】:can two char * have the same memory address even with malloc?即使使用 malloc,两个 char * 也可以具有相同的内存地址吗?
【发布时间】:2013-11-09 16:35:12
【问题描述】:

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

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

【问题讨论】:

  • 如果可能的话,世界上几乎没有软件可以工作。
  • "这两个 char* 可以有完全相同的内存地址" 不,它们可以共享相同的值(即指向的地址)。

标签: c++ c pointers char malloc


【解决方案1】:

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

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

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


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

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

【讨论】:

  • 我认为您的意思是c1c2 可能具有相同的值,不同的地址,或者它们指向相同的位置。无论如何,这只是在 C 中未指定。
  • @effeffe 当然。它们是指针,所以它们包含地址值,我按照OP的话,现在它已经修复了。
【解决方案2】:

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

但是,您当然可以说:

c2 = c1;

c2 将指代内存中与c1 相同的位置。

【讨论】:

  • 当然有办法。 Malloc 可以返回 NULL,即如果内存不足。然后 c2 = c1 = NULL。
  • 角落案例。 @Scony +1
【解决方案3】:

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

没有。

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

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

【讨论】:

    【解决方案4】:

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

    但是当你把

    char *c1 = "apple"
    

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-04
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多