【问题标题】:How does sizeof() work for char* (Pointer variables)? [duplicate]sizeof() 如何对 char*(指针变量)起作用? [复制]
【发布时间】:2013-06-25 13:06:43
【问题描述】:

我有一个 C 代码:

char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;

返回

20 8

我想知道 8 是怎么来的,谢谢!

【问题讨论】:

  • 你在什么平台上编译?

标签: c


【解决方案1】:

sizeof(s1) 是内存中数组的大小,在您的情况下,20 个字符每个 1 字节等于 20。

sizeof(s) 是指针的大小。在不同的机器上,它可以是不同的大小。我的是 4。

要在您的机器上测试不同的类型大小,您可以只传递类型而不是像 printf("%zu %zu\n", sizeof(char*), sizeof(char[20])); 这样的变量。

它将在 32 位机器上分别打印 4 和 20。

【讨论】:

  • 只是怀疑如果我们要找到 sizeof(*s) 怎么办?它给了我 1 个字节,但“fyc”应该是 3 个字节。请澄清这个疑问。
  • @ChandraShekhar 那是因为char* s 指向“fyc”的第一个字符。因此,如果您 p​​rintf *s,您会得到“fyc”的第一个字符,即“f”。单个字符重 1 个字节。这就是你得到 1 个字节的原因。
【解决方案2】:

sizeof(char *)是指针的大小,一般32位机为4,64位机为8。

sizeof 一个数组,另一方面,输出数组的大小,在这种情况下,20*sizeof(char) = 20

还有一件事,您应该使用%zu 输入size_t,输入printf 格式。

printf("%zu %zu\n", sizeof(s1), sizeof(s));

【讨论】:

    【解决方案3】:

    sizeof 运算符返回类型 的大小。 sizeof 的操作数可以是类型的括号名称或表达式,但无论如何,大小仅由操作数的类型决定。

    sizeof s1 因此严格等价于sizeof (char[20]) 并返回20。

    sizeof s 严格等同于sizeof (char*) 并返回指向char 的指针的大小(在您的情况下为64 位)。

    如果你想要s指向的C字符串的长度,你可以使用strlen(s)。

    【讨论】:

    • sizeof 可以很好地用于评估变量的大小:char c[2]; printf("%uz", sizeof(c)); 是正确的 C 并返回 2。但很可能正是您使用的措辞,才写下此评论。
    • @alk 我的意思是sizeof 运算符要么应用于表达式,要么应用于类型的括号名称。当它应用于表达式时,编译器使用该表达式推断出的类型来确定sizeof 的值。表达式是变量或文字的事实并不相关,因为它只是使用的表达式的类型,而不是值。我将重新措辞以使我的观点更清楚。
    【解决方案4】:

    8 是一个指针的大小,一个地址。在 64 位机器上它有 8 个字节。

    【讨论】:

      【解决方案5】:

      如果您使用的是 64 位计算机,则内存地址为 64 位,因此必须使用 64 位(8 字节 x 8 位/字节)数值来表示数字指针变量 (char*)。

      换句话说,sizeof() 对指针的工作方式与对标准变量的工作方式相同。使用指针时只需要考虑目标平台即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-27
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2020-03-10
        • 1970-01-01
        • 2018-05-05
        • 1970-01-01
        相关资源
        最近更新 更多