字符数组的文字字符串初始值设定项

时间:2010-01-10 04:38:18

标签: c string pointers arrays c99

在数组衰减到指针的情况下的以下规则中:

  

表达式中出现的类型为array-of-T的左值[见问题2.5]衰减(有三个例外)为指向其第一个元素的指针;结果指针的类型是指向T的指针。

     

(例外情况是数组是sizeof或&运算符的操作数,或者是字符数组的文字字符串初始值设定项。)

如何理解数组是“字符数组的文字字符串初始值设定项”的情况?请举一些例子。

谢谢!

4 个答案:

答案 0 :(得分:45)

数组不会衰减为指针的三个例外如下:

异常1。 - 当数组是sizeof的操作数时。

int main()
{
   int a[10];
   printf("%zu", sizeof(a)); /* prints 10 * sizeof(int) */

   int* p = a;
   printf("%zu", sizeof(p)); /* prints sizeof(int*) */
}

异常2。 - 当数组是&运算符的操作数时。

int main()
{
    int a[10];
    printf("%p", (void*)(&a)); /* prints the array's address */

    int* p = a;
    printf("%p", (void*)(&p)); /*prints the pointer's address */
}

异常3。 - 使用文字字符串初始化数组时。

int main()
{
    char a[] = "Hello world"; /* the literal string is copied into a local array which is destroyed after that array goes out of scope */

    char* p = "Hello world"; /* the literal string is copied in the read-only section of memory (any attempt to modify it is an undefined behavior) */
}

答案 1 :(得分:8)

假设声明

char foo[] = "This is a test";
char *bar  = "This is a test";

在这两种情况下,字符串文字“This is a test”的类型是“15个元素的char数组”。在大多数情况下,数组表达式被隐式地从类型“T的N元素数组”转换为“指向T的指针”,并且表达式求值为数组的第一个元素的地址。在bar的声明中,这正是发生的事情。

然而,在foo的声明中,表达式用于初始化另一个数组的内容,因此转换为指针类型;相反,字符串文字的内容被复制到foo

答案 2 :(得分:5)

这是字符数组的文字字符串初始值设定项:

char arr[] = "literal string initializer";

也可以是:

char* str = "literal string initializer";

K& R2的定义:

  

字符串文字,也称为字符串   常数,是一系列字符   用双引号括起来   “...”。字符串的类型为``数组   字符''和存储类静态   (见下面的参数A.3)并进行了初始化   与给定的字符。是否   相同的字符串文字是不同的   是实现定义的,和   尝试的程序的行为   改变字符串文字是未定义的。

答案 3 :(得分:2)

好像你从comp.lang.c常见问题解答中提取了这个引用(可能是旧版本或印刷版本;它与在线版本的当前状态不完全匹配):

http://c-faq.com/aryptr/aryptrequiv.html

相应部分链接到常见问题解答的其他部分,以详细说明这些例外情况。在您的情况下,您应该看看:

http://c-faq.com/decl/strlitinit.html

相关问题