【问题标题】:C string and char array declarationsC 字符串和字符数组声明
【发布时间】:2012-01-30 19:04:48
【问题描述】:

鉴于这些是允许的:

char c[] = "abc";
char c[] = {'a','b','c','\0'}
char *c = "abc";

那为什么不允许呢?

char *c = {'a','b','c','\0'};  // error: a char cannot initialize a char*

如果编译器将字符串文字解释为以 null 结尾的字符数组,那么我会认为它等同于上面的语句 3,不是吗?

同样,为什么不允许这样做:

int arr[3];
int *i = arr; // OK
int *i = {1,2,3} // error: an int cannot initialize an int*

这不是一个大问题,我只是好奇.. 我想问题归结为分配给指针时字符串文字(或声明的整数数组)和字符元素数组之间的区别是什么?

【问题讨论】:

标签: c++ c arrays string pointers


【解决方案1】:

数组不是指针。用字符串字面量初始化字符数组是一种特殊情况(6.7.8#14):

一个字符类型的数组可以由一个字符串字面量初始化,可选地用大括号括起来。字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。

还有(6.7.8#16):

否则,具有聚合或联合类型的对象的初始化程序应为元素或命名成员的初始化程序的大括号括起来的列表。

关于指针初始化(6.7.8#11):

标量的初始值设定项应该是一个表达式,可选地用大括号括起来。对象的初始值是表达式的初始值(转换后);应用与简单赋值相同的类型约束和转换,将标量的类型作为其声明类型的非限定版本。

【讨论】:

  • 谢谢,我会查阅语言规范以了解更多信息。
【解决方案2】:

数组不是指针。只是数组的名称是指向第一个数组项的指针。

您在这里要问的是在 C/C++ 中初始化数组的不同方法。 请注意:

  1. 数组只能在声明行初始化
  2. C/C++ 中没有字符串类型
  3. 字符数组在 C/C++ 中用作字符串。
  4. chars 数组的初始化与其他数组的规则相同。
  5. 如果我们定义一个没有显式长度的数组,它将使用初始值的长度来定义。
  6. 如果不定义初始值,项目将是未定义的。这意味着数组项的值最初并不清楚。
  7. 如果您有一个数组并将初始值分配给若干项中的第一项,则剩余项将为 0。
  8. 我稍后会完成这份清单 ;-)

【讨论】:

    【解决方案3】:

    字符串字面量是section DATA 中未命名数据的一种特殊情况。使用数组,您应该在堆上手动分配空间,并将数据移动到那里。 (一个接一个,因为你不能分配数组。)

    【讨论】:

    • 字符串文字通常在文本部分。数组可以在堆栈上。我不明白这个答案。
    • 关于字符串文字,我不知道,重要的是你得到一个指向它的未命名数据。 (针对{1,2,3},它只能用于初始化数组)。本地数组在堆栈中。我猜他希望指针的值即使在函数之后也是有效的。
    • 好的,我明白了.. 一个字符串字面量返回一个有效的指针,而分配一个未声明的数组(例如 {1,2,3} 到一个无效的指针,因为它不存在给我们指向它。谢谢大家。
    猜你喜欢
    • 2013-05-25
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多