【问题标题】:How sizeof operator works in C? [duplicate]sizeof 运算符如何在 C 中工作? [复制]
【发布时间】:2016-11-25 05:54:15
【问题描述】:

在下面的代码中:

#include<stdio.h>
int main(void)
{
    printf("%d",sizeof(int));
    return 0;
}

在 gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 编译器上编译时会发出警告:

格式“%d”需要“int”类型的参数,但参数 2 具有类型 ‘long unsigned int’ [-Wformat=] printf("%d",sizeof(int));

为什么我会收到此警告? sizeof 的返回类型是 'long unsigned int' 吗?

当我将 '%d' 替换为 '%ld' 时,警告消失了。

【问题讨论】:

  • sizeof 是运算符,而不是函数。
  • 这个问题在这里得到解答:stackoverflow.com/questions/24797843/…
  • 为避免警告,您必须将值转换为 int。就像当你定义自己的 sizeof() 运算符时,你需要这样的转换,#define my-sizeof(type)(int*)(&type+1)-(int*)(&type)
  • @lazyborg:您的宏不适用于my_sizeof(int)my_sizeof(v)(带有一些int v; 变量)和my_sizeof(2);换句话说,sizeof 运算符是真正需要的。

标签: c sizeof


【解决方案1】:

sizeof operator编译 时处理(并且可以应用于类型和表达式)。它给出了一些size_t 类型的常量*。在你的系统上(还有我的 Debian/Linux/x86-64)sizeof(int)(size_t)4size_t type 通常是 typedef-ed 在某种类型中,例如 unsigned long(但它实际上是什么整数类型取决于实现)。你可以编码

printf("%d", (int)sizeof(int));

或(因为printf 理解%zd%zu 控制格式字符串size_t

printf("%zu", sizeof(int));

为了获得最大的可移植性,请使用%zu(不是%ld)打印size_t(因为您可能会发现size_tunsigned int 等的系统或配置...)。

注意 *:sizeof 始终为常数,VLA 除外

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多