Question about pointers and strings in C
Possible Duplicate:
What is the difference between char s[] and char *s in C?
Difference between char *str ="…" and char str[N] ="…"?
我有一些令我困惑的代码。
1 2 3 4 5 6 7 8 9 10 11 12 |
当它输出string1的大小时,它将打印4,这是预期的,因为指针的大小是4个字节。但当它打印String2时,输出15。我以为数组是指针,所以string2的大小应该和string1相同,对吗?那么,为什么它会为同一类型的数据(指针)打印出两个不同的大小呢?
数组不是指针。数组名在某些情况下会衰减为指向数组第一个元素的指针:当你将它传递给一个函数时,当你将它赋给一个指针时,等等。但其他情况下,数组是数组-它们存在于堆栈中,有编译时大小可以用
阵列和指针是完全不同的动物。在大多数情况下,指定数组的表达式被视为指针。
首先,一点标准语言(N1256):
6.3.2.1 Lvalues, arrays, and function designators
...
3 Except when it is the operand of thesizeof operator or the unary& operator, or is a string literal used to initialize an array, an expression that has type"array of type" is converted to an expression with type"pointer to type" that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.
字符串文本"this is a test"是
1 | char *string1 ="this is a test"; |
1 | char string2[] ="this is a test"; |
发生了一些不同的事情。更多标准语言:
6.7.8 Initialization
...
14 An array of character type may be initialized by a character string literal, optionally
enclosed in braces. Successive characters of the character string literal (including the
terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.
...
22 If an array of unknown size is initialized, its size is determined by the largest indexed element with an explicit initializer. At the end of its initializer list, the array no longer has incomplete type.
在这种情况下,
下面是一个假设性的记忆地图来说明发生了什么:
1 2 3 4 5 6 7 8 9 10 11 12 | Item Address 0x00 0x01 0x02 0x03 ---- ------- ---- ---- ---- ---- no name 0x08001230 't' 'h' 'i' 's' 0x08001234 ' ' 'i' 's' ' ' 0x08001238 'a' ' ' 't' 'e' 0x0800123C 's' 't' 0 ... string1 0x12340000 0x08 0x00 0x12 0x30 string2 0x12340004 't' 'h' 'i' 's' 0x12340008 ' ' 'i' 's' ' ' 0x1234000C 'a' ' ' 't' 'e' 0x1234000F 's' 't' 0 |
字符串文本具有静态范围;也就是说,在程序启动时为它们留出内存,并一直保留到程序终止。试图修改字符串文字的内容会调用未定义的行为;基础平台可能允许也可能不允许,并且标准对编译器没有任何限制。最好表现得好像文字总是不可写的。
在上面的内存映射中,字符串文字的地址与
无论如何,您可以看到,具有指针类型的
由于
1 2 3 4 |
注意,
未知大小的数组等价于用于size of目的的指针。静态大小的数组作为其自身的类型来计算size of用途,size of报告数组所需的存储大小。尽管
这似乎是对sizeof行为的一个很好的参考。
第二行类似于
编译器知道
其因为
基本上,C编译器iterprets这2个不同。这里很好地解释了http://c-faq.com/aryptr/aryptr 2.html。
数组不是指针。指针是指向内存位置的变量,而数组是分配顺序内存的起始点。