【问题标题】:sizeof() function in C [duplicate]C中的sizeof()函数[重复]
【发布时间】:2013-07-16 07:25:15
【问题描述】:
main()
{
char a[] = "Visual C++";
char *b = "Visual C++";
printf("\n %d %d",sizeof(a),sizeof(b));
printf("\n %d %d",sizeof(*a),sizeof(*b));
}

sizeof(a) 给我输出:11(即字符串的长度)

为什么会这样?
为什么不是输出sizeof(a)=4,因为当我尝试打印a 时,它给了我一个地址值,因此是一个整数?

【问题讨论】:

  • 阅读:What does sizeof(&arr) return? 给出了带有图表和工作代码的答案
  • 而且,为了挑剔,sizeof 是一个运算符,而不是一个函数。
  • @Shivaji_Vidhale:“自从我尝试打印 a 时,我得到了一个地址。”还有一次,只有当你告诉它打印一个地址时,你才会得到一个地址。只是不要告诉它这样做,你的困惑就会消失。
  • @PHIfounder 我不这么认为。 sizeof() 总是产生其参数的大小。也不例外。
  • @PaulGriffiths:这不是对语义的准确描述。 sizeof 有一个明确的例外。 C 2011 6.3.2.1 3:“除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串文字,否则表达式类型为 ''array of type '' 被转换为类型为 ''pointer to type'' 的表达式,它指向数组对象的初始元素并且不是左值。”

标签: c arrays pointers


【解决方案1】:

每当您在程序中引用数组的名称时,它通常会衰减为指向数组第一个元素的指针。此规则的一个例外是sizeof 运算符。所以当你考虑下面的代码时。

int main()
{
   char a[] = "Visual C++";
   printf("sizeof(a)=%d\n",sizeof(a)); /* Here sizeof(a) indicates sizeof array */
   printf("a=%p",a); /* Here the array name, passed as an argument to printf decays into a pointer of type (char *) */
   return 0;
}

【讨论】:

  • 我不确定“a 指的是指针”的准确性(或英语语义),但指向 a 的第一个元素的指针传递为printf 的第二个参数。
  • 进一步扩展:使用的正确术语是“数组衰减为指针”或“隐式转换为指针”。
  • 感谢您的建议。改进了评论。
  • 是的a的类型是char[N],指针的类型是char*b的类型),但在大多数操作中char[N]衰减为char*但不是@ 987654331@.
【解决方案2】:

在声明 char a[] = "Visual C++" 中,a 是一个由 11 个 char 组成的数组。所以它的大小是 11 个字节。

在声明char *b = "Visual C++" 中,b 是指向char 的指针。所以它的大小是四个字节(在你使用的 C 实现中)。

在表达式printf("%s", a)中,a也是一个数组。但是,它会自动转换为指向数组第一个元素的指针。所以指向char 的指针被传递给printf

除非数组是&sizeof_Alignof 的参数,或者是用于初始化char 数组的字符串文字,否则此转换会自动发生。因为它是自动发生的,所以人们倾向于将数组名称视为指针。但是,它们不是。

顺便说一句,sizeof 是一个运算符,而不是一个函数。

【讨论】:

    【解决方案3】:

    当 sizeof 应用于静态数组(不是通过 malloc 分配的数组)的名称时,结果是整个数组的大小(以字节为单位)。这是将数组名称转换为指向数组第一个元素的指针的规则的少数例外之一,这可能只是因为实际数组大小在编译时是固定的并且已知,当 sizeof 运算符是评估。

    【讨论】:

      【解决方案4】:

      这里有很多错误。

      sizeof(a) 给我输出:11(字符串的长度)”

      字符串的长度是10,而不是11sizeof(a) 为您提供数组的长度。

      “为什么会这样,为什么不是输出sizeof(a)=4,因为当我尝试打印a时它给了我一个地址值”

      这里有两种“打印a”的方法,它们不会“给你一个地址值”:

      puts(a);
      

      和:

      printf("%s\n", a);
      

      所以你的逻辑是有缺陷的,这就是你困惑的根源。 “打印a”仅在您明确或隐含选择这样做时“为您提供地址值”。

      sizeof(a) 在这种情况下给出 11,因为 C 语言定义了 sizeof 运算符,以便在数组是操作数时为您提供数组的大小。我认为这是人们所期望的最自然的行为,所以大概这就是它被定义为这样的原因。

      “因此是一个整数。”

      在任何情况下,地址都是地址,而不是整数。充其量你可以争辩说它应该给你指针的大小,但肯定不是整数的大小。

      【讨论】:

      • "但是,整数的大小是 4 字节,指针的大小也是 4 字节,反正指针就是整数!" (最好在 OP 之前发表此评论。)
      猜你喜欢
      • 1970-01-01
      • 2014-09-13
      • 2023-04-11
      • 2015-11-22
      • 2011-09-22
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      相关资源
      最近更新 更多