【问题标题】:With respect to char pointer, how does the sizeof operator work? [duplicate]关于 char 指针,sizeof 运算符是如何工作的? [复制]
【发布时间】:2015-01-25 14:50:41
【问题描述】:

下面是代码(用gcc编译):

#include <stdio.h>
#include<string.h>

int main()
{
    char *c="hello";
    printf("1) sizeof 'hello' : %d \n",sizeof("hello"));
    printf("2) sizeof '*c' : %d \n",sizeof(*c));
    printf("3) sizeof 'c': %d \n",sizeof(c));
    printf("4) sizeof '&c' : %d \n",sizeof(&c));
    printf("5) sizeof '&hello': %d \n",sizeof(&("hello")));
    printf("\n");
    return 0;
}

给定程序的输出:

1) sizeof 'hello' : 6                                                                               
2) sizeof '*c' : 1                                                                                  
3) sizeof 'c': 8                                                                                    
4) sizeof '&c' : 8                                                                                  
5) sizeof '&hello': 8 

所以,对于情况 1) 和 2),为什么这个输出没有问题。 但是对于其余的情况,即 3)、4) 和 5),为什么 sizeof 运算符给出 8?

据我所知,&amp;cc&amp;"hello" 代表相同的事物,即一组字符(即 c 指向“你好”),*c 代表单个字符(即 @ 987654329@ 指向 'h')。

那么,为什么sizeof(c) 给出的是 8 而不是 6?这个 8 是从什么计算而来的?

【问题讨论】:

  • 它实际上是一个指向 char 数组第一个元素的指针,因此在 x64 架构上是 8 个字节
  • @Quest 谢谢。知道了。我忘记了 64 位拱门。因为我在在线 gcc 上运行代码并假设服务器是 32 位机器。
  • “代表同一件事”——不,它们不代表同一件事。它们指针的数值可能相同,但它们没有其他共同点。这三个指针具有相同的类型(char *char **char (*)[6]),并且在概念上非常不同。 (第一个指向一个字符,第二个指向指针,第三个指向一个数组。)
  • 顺便说一句,使用%d 转换说明符格式化sizeof 的结果是未定义的行为。 %d 用于int,但sizeof 的值为size_t,其正确的转换说明符为%zu

标签: c++ c gcc g++


【解决方案1】:

sizeof 仅检查参数的类型,从不检查其值。
"hello"char const[6] 类型的左值。数组对象的大小就是元素大小乘以边界。 char 的大小定义为 1,因此 sizeof *c 为 1,sizeof "hello" 为 6*1=6。

指针通常为 4 或 8 字节大 - 在您的平台上为 8,如
sizeof c 的值所示。
sizeof (&amp;c)sizeof(&amp;("hello")) 为您提供与 sizeof c 相同的输出.同样,只是指针的大小。

【讨论】:

    【解决方案2】:

    c 是指向char 的指针。在 64 位系统上任何指针的大小都是 8 字节。

    "hello" 是一个字符数组(实际上是char const[6])。这就是为什么sizeof("hello") 是 6。

    当您编写c = "hello"; 时,数组"hello" 衰减为指向其第一个元素的指针。

    【讨论】:

      【解决方案3】:

      这些相差甚远:

      1. “hello”是一个由六个字符组成的数组。
      2. c 是一个指针(指向一个字符)。
      3. &c 也是一个指针(指向一个指针)。
      4. &"hello" 是一个指针(指向六个字符的数组)。

      在某些情况下,它们的行为相同,因为在某些用例中 char 数组会衰减为 char 指针。但是,这是一种转换,不会改变它们的本质!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-27
        • 2019-02-12
        • 2018-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多