带有字符串的 C 行为中的 sizeof 运算符

问题描述

对于 sizeof 运算符,我看到以下结果;我无法理解背后的原因。 我的理解是 sizeof 运算符根据 size_t 返回结果 结果如下,

sizeof("6") -> 2
sizeof("a") -> 2
sizeof('a') -> 4
sizeof("something") -> 10
sizeof("some") -> 5

解决方法

根据定义 (C11 3.6),1 个字符需要 1 个字节(在某些外来系统中可能不是 1 个八位字节)

"6" 的类型为 char[2],所以 2 个字节
"a" 的类型为 char[2]
'a' 在您的系统中有 int ==> 类型,int 需要 4 个字节
"something" 的类型为 char[10]
"some" 的类型为 char[5]

请注意,"a"'a' 是非常不同的东西:"a" 是一个由 char 组成的数组,有 2 个元素; 'a' 是一个 int 值,非常类似于 42-1

,

在这样的记录中

sizeof("6") -> 2

使用字符串文字作为操作数。

字符串文字是存储以零字符 '\0' 结尾的字符序列的字符数组。

例如字符串文字 "6" 存储在内存中,如

char literal_6[] = { '6','\0' };

或者这个声明等价于

char literal_6[2] = { '6','\0' };

注意:例如字符串文字“some”像声明为的字符数组一样存储在内存中

char literal_some[] = { 's','o','m','e','\0' };

所以表达式 sizeof("6") 等价于表达式 sizeof( char[2] )

在这个记录中

sizeof('a') -> 4

使用了类型为 '4' 的整数字符常量 int

所以这个表达式 sizeof('a') 等价于表达式 sizeof( int )

有趣的是,例如 sizeof("something") 不等于 sizeof("something" + 0)。在最后一个表达式中,表示字符串文字的字符数组被隐式转换为指向其第一个元素的指针。所以最后一个表达式等价于表达式sizeof( char * )

如果你有,也要注意这一点

int x = 10;
size_t n = sizeof( ++x );

then x 在声明 11 之后将不等于 n,因为在这种情况下,用作 sizeof 运算符的操作数的表达式不会被计算。重要的是表达式的类型。

另一方面,如果您有一个可变长度数组,那么运算符 sizeof 将在运行时进行评估以确定其大小。这是一个演示程序。

#include <stdio.h>

int main(void) 
{
    for ( int i = 1; i < 5; i++ )
    {
        int a[i];
        printf( "sizeof( a[%d] ) = %zu\n",i,sizeof( a ) );
    }
    
    return 0;
}

程序输出为

sizeof( a[1] ) = 4
sizeof( a[2] ) = 8
sizeof( a[3] ) = 12
sizeof( a[4] ) = 16