sizeof 接受什么类型的参数?

0 c

我有以下代码:

void main(int argc, char *argv[]){
    for (int i=1; i<argc; i++){
        printf("%s-%lu\t", argv[i], sizeof(argv[i]));
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这$./a.out int long应该给我

short-2 int-4 long-8 
Run Code Online (Sandbox Code Playgroud)

但我得到了

short-8 int-8 long-8
Run Code Online (Sandbox Code Playgroud)

有人能告诉我为什么吗?

P__*_*J__ 6

sizeof不是一个函数;它是一个运算符。

它为您提供对象、类型或常量表达式的大小。如果您将其作为字符串传递,它不会为您提供类型的大小。

sizeof("long")将为您提供字符串文字 的大小"long"(即 5)而不是类型的大小long(例如 8)。

由于argv是指向 的指针数组charsizeof(argv[j])将为您提供 的大小pointer to char

  • @RobertHarvey:这是相关的,因为函数的参数与操作数和运算符的处理方式不同。函数的参数经历默认参数提升(对于没有原型的函数或与“...”对应的参数)或转换为参数类型(否则)。运算符的操作数根据运算符的不同而有不同的处理方式。特别是,“sizeof”的操作数不会进行左值转换、数组到指针转换、函数到指针转换或整数提升。 (4认同)
  • @RobertHarvey OP的问题确实在其他人编辑之前提到了“c function sizeof()”,所以指出它不是一个函数没有什么坏处。 (3认同)
  • @RobertHarvey:此外,使用正确的术语有助于沟通。如果一个程序员对另一个程序员说某行代码中的函数调用有错误,那么另一个程序员将​​寻找实际的函数调用和其中的一些错误,而不是查看“sizeof”表达式。 (3认同)
  • “sizeof 不是一个函数”现在已经被提到两次,但没有解释为什么这与OP的问题相关(除了一些小的语法问题)。 (2认同)
  • 这没什么帮助。 (2认同)