引用我读过的一篇文章:
*...Consider使用以下两个变量:
char s6[ ] = "hello", *s7 = "hello";s6为6个字节分配空间;s7为字符分配10 (通常)-6的空间,另为指针变量分配4个空间。
想知道谁持有s6的地址(数组中的第一个字符)?s6如何“保存”指针的4个字节?
发布于 2019-07-08 06:54:15
简单地说,它没有存储在程序中的任何地方。只有编译器才能跟踪它。
在引擎盖下:
s6的意思是"address XXXXXXXX:一个包含值'H', 'e', 'l', 'l', 'o', 0的六个字节的块“。s7的意思是"address YYYYYYYY:一个包含值ZZ, ZZ, ZZ, ZZ的四个字节的块“*s7的意思是"address ZZZZZZZZ:一个字节的块,保存值'H'“。程序实际上不必将值存储;编译器只需插入您使用s6的任何地方的值XXXXXXXX。
类似地,程序不必在任何地方存储YYYYYYYY,但它确实存储着ZZZZZZZZ,因为您明确地这样说了(您说将值ZZZZZZZZ赋给变量s7)。
但是,如果您想将XXXXXXXX存储在某个地方,您可以轻松地这样做:
char my_pointer* = &s6;现在,my_pointer的意思是"address :一个包含值XX, XX, XX, XX的四个字节的块“。
这是假设你在一个有四个字节指针的系统上;现在,指针很可能是八个字节,或者64位。
发布于 2019-07-08 06:46:52
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"),或,sizeof (char 6) s7 =8 // sizeof (char *)
发布于 2019-07-08 06:54:26
想知道谁持有s6的地址(数组中的第一个字符)?s6如何“保存”指针的4个字节?
编译器/链接器保存此地址。它被视为常量,因为它不能在运行时被修改。我希望这能帮到你。
https://stackoverflow.com/questions/56929583
复制相似问题