关于大小的字符数组与字符指针

时间:2019-07-08 06:43:20

标签: c arrays pointers sizeof

我所读文章的引用:

* ...请考虑以下两个变量:

char s6[ ] = "hello", *s7 = "hello";

s6恰好为6个字节分配空间; s7分配10个字符(通常为)的空间-6个字符,再加上4个指针变量。*

对谁拥有s6(数组中第一个字符的地址)的地址感到好奇吗? s6如何为指针“保存” 4个字节?

3 个答案:

答案 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个字节?

编译器/链接器保留此地址。将其视为常量,因为无法在运行时对其进行修改。我希望这会有所帮助。