我所读文章的引用:
* ...请考虑以下两个变量:
char s6[ ] = "hello", *s7 = "hello";
s6
恰好为6个字节分配空间; s7
分配10个字符(通常为)的空间-6个字符,再加上4个指针变量。*
对谁拥有s6
(数组中第一个字符的地址)的地址感到好奇吗? s6
如何为指针“保存” 4个字节?
答案 0 :(得分:4)
简单地说,它没有存储在程序中的任何位置。只有编译器会跟踪它。
引擎盖下
s6
的意思是“地址XXXXXXXX:六个字节的块,其中包含值'H', 'e', 'l', 'l', 'o', 0
” s7
的意思是“地址YYYYYYYY:四个字节的块,其中包含值ZZ, ZZ, ZZ, ZZ
” *s7
的意思是“地址ZZZZZZZZ:一个字节,保留值'H'
的块” 程序实际上不必将值XXXXXXXX存储在任何地方。 编译器只会在您使用s6
的任何位置插入值XXXXXXXX。
类似地,该程序不必在任何地方存储YYYYYYYY,但是它确实存储ZZZZZZZZ,因为您是专门这样说的(您曾说过将ZZZZZZZZ值分配给变量s7
)。
但是,如果您想将XXXXXXXX存储在某个地方,则可以轻松做到这一点:
char my_pointer* = &s6;
现在my_pointer
的意思是“地址WWWWWWWW:四个字节的块,保存着值XX, XX, XX, XX
”。
P.S。假设您使用的是具有四字节指针的系统;如今,指针更可能是8个字节或64位。
答案 1 :(得分:3)
s6为6个字节分配空间; s7为10(通常为)分配空间-6个字符分配空间,再为指针变量分配4个空间。
不,那是不正确的。
s6
的空间正好为6个字节,s7
的空间(大小)为指针的空间(通常为4或8个字节,具体取决于您的体系结构),它指向用于初始化它。
换句话说,
s6
的大小为sizeof ("hello")
。s7
的大小为sizeof (s7)
,即sizeof (char *)
您可以执行以下程序来检查尺寸:
#include <stdio.h>
int main(void)
{
char s6[ ] = "hello", *s7 = "hello";
printf("s6 = %zu\n", sizeof (s6));
printf("s7 = %zu\n", sizeof (s7));
return 0;
}
在我的系统上,它们产生:
s6 = 6 // sizeof(“ hello”)或or sizeof(char [6])
s7 = 8 // sizeof(字符*)
答案 2 :(得分:2)
好奇谁持有s6(地址中第一个字符的地址) 数组)? s6如何为指针“保存” 4个字节?
编译器/链接器保留此地址。将其视为常量,因为无法在运行时对其进行修改。我希望这会有所帮助。