【问题标题】:Sizes of arrays declared with pointers用指针声明的数组的大小
【发布时间】:2013-08-24 02:27:34
【问题描述】:
char c[] = "Hello";
char *p = "Hello";

printf("%i", sizeof(c)); \\Prints 6
printf("%i", sizeof(p)); \\Prints 4

我的问题是:

为什么这些打印出不同的结果? c[] 不是也声明了一个指向数组第一个字符的指针(因此大小应该为 4,因为它是一个指针)?

【问题讨论】:

标签: c arrays pointers sizeof


【解决方案1】:

听起来您对指针和数组感到困惑。指针和数组(在本例中为 char *char [])为 not the same thing.

  • 数组char a[SIZE]表示a位置的值是一个长度为SIZE的数组
  • 指针char *a; 表示a 位置处的值是指向char 的指针。这可以与指针算法相结合,使其表现得像一个数组(例如,a[10] 是超过 a 点的 10 个条目)

在内存中,它看起来像这样(示例取自the FAQ):

 char a[] = "hello";  // array

   +---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
   +---+---+---+---+---+---+

 char *p = "world"; // pointer

   +-----+     +---+---+---+---+---+---+
p: |  *======> | w | o | r | l | d |\0 |
   +-----+     +---+---+---+---+---+---+

指针和数组之间的区别很容易混淆,因为在许多情况下,数组引用“衰减”到指向它的第一个元素的指针。这意味着在许多情况下(例如传递给函数调用时)数组成为指针。如果您想了解更多信息,请this section of the C FAQ describes the differences in detail

一个主要的实际区别是编译器知道数组的长度。使用上面的例子:

char a[] = "hello";  
char *p =  "world";  

sizeof(a); // 6 - one byte for each character in the string,
           // one for the '\0' terminator
sizeof(p); // whatever the size of the pointer is
           // probably 4 or 8 on most machines (depending on whether it's a 
           // 32 or 64 bit machine)

【讨论】:

    【解决方案2】:

    sizeof 的两个操作数具有不同的类型。一个是char 的数组,另一个是指向char 的指针。

    C 标准规定,当 sizeof 运算符应用于数组时,结果是数组中的总字节数。 c 是一个包含NUL 终止符的六个char 的数组,char 的大小定义为1,因此sizeof (c) 为6。

    然而,指针的大小取决于实现。 p 是指向 char 的指针。在您的系统上,指向char 的指针大小恰好是4 个字节。这就是您使用sizeof (p) 看到的内容。

    但是,如果您尝试sizeof(*p)sizeof(*c),它们的计算结果都将为1,因为取消引用的指针和数组的第一个元素都是char 类型。

    【讨论】:

      【解决方案3】:

      它们的输出不一样,因为数组和指针不一样。没有理由他们应该是一样的。在许多情况下,数组会隐式转换为指针,但这并不能使它们完全相同。

      【讨论】:

        【解决方案4】:

        "sizeof" 是编译器的指令。结果指示参数占用的内存大小。编译器负责根据参数的类型确定结果。关于“数组”,返回数组大小。此外,对于 32 位机器,指针通常返回“4”。

        【讨论】:

          【解决方案5】:

          指针和数组不同。

          char c[] = "Hello"; //将 c 声明为一个数组。 sizeof(c) 计算数组6的大小。
          char *p = "Hello"; //将p声明为指针。sizeof(p) 计算指针的大小,在大多数机器中指针的大小是4。

          您也可以参考c traps and pitfall>。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-08-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-14
            • 1970-01-01
            相关资源
            最近更新 更多