C语言Sizeof()

  • Post author:
  • Post category:其他




C语言数据类型

C语言中在使用一个变量前需要对变量进行声明,声明的同时要确定变量的数据类型。C语言中的数据类型有:

  1. char、 short、 int、 long、 long long
  2. float、double、long double
  3. bool
  4. 指针
  5. 自定义类型

    其中,整型变量在内存中以二进制(补码)的形式存储,浮点型以编码的形式存储。所以整型数据可以直接使用加法器进行运算,而浮点型不可以直接使用加法器进行运算。



sizeof运算

1 、sizeof是C语言中的一个运算符,用来计算某个

数据类型

或某个

变量

在内存中占用的字节数(byte),如:

  • sizeof(int); //sizeof(数据类型)
  • sizeof(price); //sizeof(变量)

    在C语言中,对sizeof()的处理是在编译阶段完成的,即在编译结束后sizeof()的结果就已经确定了。
int a;
a = 6;
printf("sizeof(a) = %ld\n", sizeof(a++));
printf("sizeof(int) = %ld\n", sizeof(int));
printf("a = %ld\n", a);

运行结果:

sizeof(a) = 4
sizeof(int) = 4
a = 6

变量a的值并没有加1,那是因为sizeof(a++)在编译阶段就已经确定结果了,a++根本就没有执行。


2 、sizeof计算变量占用内存的大小其实是计算该变量数据类型的大小。即同种数据类型的不同变量,它们的sizeof值都是一致的。

int a,b;
a = 6;
b = 18;
printf("sizeof(a) = %ld\n", sizeof(a));
printf("sizeof(b) = %ld\n", sizeof(b));

运行结果:

sizeof(a) = 4
sizeof(b) = 4

3 、sizeof对一个表达式求值,编译器根据表达式的最终结果的数据类型来确定大小,但是一般不会对表达式进行计算。如:

printf("sizeof(a) = %ld\n", sizeof(a));
printf("sizeof(b + 0.3) = %ld\n", sizeof(b + 0.3));

运行结果:

sizeof(a) = 4
sizeof(b + 0.3) = 8

因为b + 0.3之后变成一个double数据类型,所以其大小为8个字节。


4 、sizeof也可以对一个被调函数求值,其结果是函数返回类型的大小,但函数并不会被真正调用,即函数不会被执行。

double add(int *temp)
{
    (*temp)++;
    return 0.5;
}

int main()
{
    int a,b;
    a = 6;
    b = 18;
    printf("sizeof(a) = %ld\n", sizeof(add(&a)));
    printf("a = %ld\n", a);
}

运行结果:

sizeof(a) = 8
a = 6

变量a的值并没有加1,那是因为函数根本就没有执行。且sizeof的计算大小是8,它是根据函数返回值类型double来计算大小的。


5 、sizeof()计算指针类型时,与指针所指向的对象没有关系,所有指针变量的大小都是一样的,所以很多形参都使用指针类型。

char*pc="abc";
int *pi;
double *ps;
char **ppc = &pc;
void(*pf)();//函数指针
printf("%ld\n", sizeof(pc));
printf("%ld\n", sizeof(pi));
printf("%ld\n", sizeof(ps));
printf("%ld\n", sizeof(ppc));
printf("%ld\n", sizeof(pf));

运行结果:

4
4
4
4
4

从结果可以看出指针变量占用内存都是一样的,与指向对象没有关系。


6 、sizeof()计算数组内存时,计算的是整个数组所占用的内存大小,与数组类型和数据长度等相关。

char a[] = "abc"; 
int  b[3]; 
printf("sizeof(a) = %ld\n", sizeof(a));
printf("sizeof(b) = %ld\n", sizeof(b));

运行结果:

sizeof(a) = 4
sizeof(b) = 12

字符数组a的大小之所以是4而不是3,原因在于数组末尾有个隐藏的停止符。数组b为整型数组,一个组员是4个字节,3个组员共占12个字节。


7、当数组作为函数形参时,数组会退化为指针,其占用的内存大小为一个指针的大小。

void foo3(char a3[])
{
printf("sizeof(a3) = %ld\n", sizeof(a3));
}
void foo4(int a4[])
{
printf("sizeof(a4) = %ld\n", sizeof(a4));
}

int main()
{
    char a[] = "abc"; 
    int  b[] = {1, 2, 3, 4}; 
    foo3(a);
    foo4(b);
}

运行结果:

sizeof(a3) = 4
sizeof(a4) = 4

8 、sizeof()计算结构体变量或类型的大小时,因为结构体存在数据对齐,所以其大小会因为结构体成员的顺序不同而不同。

typedef struct 
{
    char a[2]; 
    int  b[4];
    char c; 
} Data;

int main()
{
    Data test1;
    printf("sizeof(test1) = %ld\n", sizeof(test1)); 
}

运行结果:

sizeof(test1) = 24

因为结构体要以最宽的数据类型来对齐内存,结构体Data中,最宽的数据类型是int,所以所有数据都要按照int类型对齐。字符数组不足4个字节就按4个字节算,字符c不足4个字节也按4个字节算。所以总大小是6*4=24个字节。

当把字符变量c放到整型数组b上面时,结果又不相同,如下所示:

#include <stdio.h>
typedef struct 
{
    char a[2]; 
    char c; 
    int  b[4];
} Data;

int main()
{
    Data test1;
    printf("sizeof(test1) = %ld\n", sizeof(test1)); 
}

运行结果:

sizeof(test1) = 20

因为字符数组a和字符c总和都不到一个字节,所以两个变量作为一个整型来对齐,占4个字节。


9 、sizeof()计算共用体变量或类型的大小时,其大小与共用体变量宽度最大的成员的大小一致。

typedef union 
{
    char a[2]; 
    char c; 
    int  b[4];
} Data;

int main()
{
    Data test1;
    printf("sizeof(test1) = %ld\n", sizeof(test1)); 
}

运行结果:

sizeof(test1) = 16

在共用体Data中,宽度最宽的成员变量是整型数组a,占16个字节,所以共用体的占用内存也是16个字节。


10 、sizeof()表达式可以作为常量使用,以下语句是合法的:

char ary[sizeof(int)*10];

11 、sizeof()计算的是变量的实际内存大小而不是变量的长度,但是常被用来计算数组变量的长度,如下所示:

int a[] = {4, 6, 9, 19, 20};
printf("length of a is = %ld\n", sizeof(a) / sizeof(a[0])); 

运行结果:

length of a is = 5



版权声明:本文为weixin_43814616原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。