【C】-数据类型及存储空间长度
1、C语言中数据类型有哪些
C语言中有以下四种数据类型。
类型 | 具体数据类型 |
---|---|
基本数据类型 | int,char,float,double |
派生数据类型 | arry,pointer,structure,union |
枚举数据类型 | enum |
void数据类型 | void |
void
void是空类型,一般用于函数的返回类型表示,表示函数啥都不返回。通常用于以下三种情况。
/* 1、返回函数为空 */
void exit(int status);
/* 2、函数参数为空 */
int fun(void);
/* 指针指向为空,返回值可以转换成任何数据类型 */
void* malloc(size_t size);
2、数据类型的存储空间长度
3、sizeof()计算存储空间长度
在 C 语言中,sizeof 是一个编译时运算符,用于计算数据类型或表达式所占用的内存字节数。合理使用 sizeof 可提高代码的可移植性和安全性,尤其在动态内存分配和数据结构操作中至关重要。
3.1、sizeof 的基本语法
sizeof(type) // 计算类型的大小
sizeof expression // 计算表达式的大小(括号可选)
3.2、常见的使用场景
/* (1)动态内存分配:在 malloc、calloc 中计算所需内存大小: */
int* arr = (int*)malloc(sizeof(int) * 10); // 分配10个int的空间/* (2)数组长度计算:获取数组元素个数: */
int arr[] = {1, 2, 3, 4, 5};
size_t length = sizeof(arr) / sizeof(arr[0]); // 计算数组长度/* (3)结构体 / 联合体大小:计算自定义类型的内存占用: */
struct Person {char name[20];int age;
};
printf("%zu\n", sizeof(struct Person)); // 输出结构体大小(可能>24字节,涉及对齐)/* (4)数据传输与协议:在网络或文件传输中确定数据块大小: */
fread(buffer, sizeof(int), 10, file); // 读取10个int到buffer
3.3、使用注意事项
(1)sizeof 是编译时运算符:
- 在编译阶段求值,不执行表达式。
int a = 10;
sizeof(a++); // a的值不会增加,因为sizeof在编译时处理
(2)数组名与指针的区别
- 数组名在 sizeof 中表示整个数组:
int arr[10];
printf("%zu\n", sizeof(arr)); // 输出40(假设int为4字节)
- 但作为函数参数时,数组名退化为指针:
void func(int arr[]) {printf("%zu\n", sizeof(arr)); // 输出指针大小(4或8字节)
}
(3)结构体对齐
- 结构体大小可能因字节对齐而大于成员大小之和:
struct Example {char c; // 1字节int i; // 4字节
};
printf("%zu\n", sizeof(struct Example)); // 通常8字节(因对齐)
(4)void* 与其他指针大小一致
- 所有指针类型(包括 void*)在同一平台下大小相同:
printf("%zu\n", sizeof(void*)); // 输出4或8字节
(5)不支持函数类型和位域
- sizeof 不能用于函数类型或位域成员:
int func();
// sizeof(func); // 错误:不能对函数使用sizeofstruct {unsigned int flag : 1; // 位域
} s;
// sizeof(s.flag); // 错误:不能对位域使用sizeof