内存分配char*和char []

bli*_*egz 34 c++

在内存分配方面,这两者有什么区别.

char *p1 = "hello"; 
char p2[] = "hello";
Run Code Online (Sandbox Code Playgroud)

Nik*_*sov 39

第一个创建一个指针变量(存储器的四个或八个字节,具体取决于平台)并在那里存储一个字符串文字的位置,第二个创建一个包含六个字符的数组(包括零字符串终结符字节)并在那里复制文字.

您应该在第一行获得编译器警告,因为文字是const.

  • 字符串文字通常存储在与堆栈和(`new` /`delete`-managed)堆分开的内存区域中.根据您的平台,此区域可能受到复制保护,因此写入该区域会使程序崩溃. (12认同)

Pau*_*l R 8

第一个是指向const(只读)数据的非const指针,第二个是非const数组.

  • @Mahatma:是的,这也是更易读和更直观的版本:`const char*p1 ="hello"`. (3认同)
  • @Mahatma:是的,但第一个是危险的:没有`const`限定,没有编译器保护来防止尝试修改字符串文字,给出未定义的行为. (2认同)

Naw*_*waz 6

由于第一个是指向const(只读)数据的非const指针,第二个是非const数组,正如Paul所说,你可以写:

p2[2]='A'; //changing third character - okay
Run Code Online (Sandbox Code Playgroud)

但你不能写:

p1[2]='A';//changing third character - runtime error!
Run Code Online (Sandbox Code Playgroud)

  • 第二种情况实际上比编译错误更糟糕;编译器很可能会接受它,从而给出未定义的运行时行为。 (2认同)
  • 这不是真的——他不会得到编译错误,因为字符串文字不是 const。然而他会得到UB。 (2认同)
  • 那不是固定的。该代码产生 UB,这不是运行时错误。这是未定义的行为。现在,实际上在大多数平台上,您都会收到运行时错误(Unix 变体上为 SIGSEGV,Windows 上为访问冲突)。然而,《标准》对此只字未提,而且由于他没有提到他的平台,所以你不能假设这一点。 (2认同)