进程/类型限定符

设计函数的准则:

1、一个函数最高只解决一个问题,这样可以降低错误率,提高代码可读性
2、最好不依赖其他函数(降低耦合度)
3、数据由调用者提供,把结果返回给调用者(通用性)
4、要考虑清楚调用者提供的非法数据,可以通过返回值告诉调用者,或者把可能出现的情况
写在注释上(健壮性)

进程映像:

程序:储存在磁盘上的可执行文件(二进制文件,脚本文件)
进程:正在系统中运行的程序
进程映像:指的是进程的内存分布情况

text 代码段: 存储的是二进制指令、常量数据,权限是只读,强制修改会产生段错误
data 数据段: 存储为初始化过的全局变量
bss 静态数据段:存储未初始化过的全局变量、为初始化过的静态局部变量,
程序运行时会自动清理为0
stack 栈: 局部变量、块变量,会随着程序循行而不断地申请、释放,由系统统一管理
但是小
heap 堆: 由程序员手动管理,特点 大

局部变量和全局变量:

    全局变量:定义在函数外部的变量;
        存储位置:  date(初始化过)或者bss(未初始化过)
        生命周期:  从main运行前直到程序结束才释放
        使用范围:  程序的任意位置都可以使用
    

局部变量:定义在函数内的变量
        存储位置:  stack 栈内存
        生命周期:  从函数调用开始到函数执行结束
        使用范围:  只能在本函数内使用

    快变量:定义语句块内的变量if while for
        存储位置:  stack 栈内存
        生命周期:  从函数调用开始到函数执行结束
        使用范围:  只能在所在语句块内使用

局部变量会屏蔽同名的全局变量,块变量会屏蔽同名的局部变量和全局变量
全局变量变量名建议首字母大写

类型限定符:

auto

用于定义自动分配、释放内存的变量(局部变量),不加代表了加
        注意:全局变量不能用它修饰
        在C11中 可以自动识别类型
        int num = 10;auto num = 10;

extern

        声明变量,意思是说明此变量已经在别处定义,请放心使用
        但是只能临时通过编译,链接时如果没定义,依然还是会报错
        不能赋值

static

!!!!!!!!!!!
        改变存储位置:
            改变局部变量的存储位置:由stack栈内存改为data或者bss
            (由局部变量是否初始化决定)
            被它修饰过的局部变量也成为静态局部变量

        延长生命周期:
            可以延长局部变量的生命周期

        限制作用范围:
            限制全局变量、函数只能在本文件中使用

        防止全局变量、函数名冲突,还可以防止被别人调用

const

        "保护"变量不被显示地修改
        但是,如果对初始化过的全局变量、静态局部变量,都会变成常量,一定
        不能修改了

volatile

        如果变量的值没有被显示地修改,盖茨使用该变量时不会从
        内存中重新读取,而是继续使用上一次读取结果(取值优化)
        变量被volatile修饰后,每次使用该变量时,都会从内存重新读取
        一般硬件编程或者多线程编程时都会使用
        volatile int num = 10;
        int num = 10;
        printf("%d",num);
        printf("%d",num*2);

        volatile int num = 10;
        if(num == num)
        {
            
        }
    存储介质:硬盘->内存->高级缓存->寄存器

register

        申请把变量的存储介质由内存改为寄存器,但是寄存器有限,
        不一定能百分百成功
        注意:寄存器变量不能取地址

    typedef
        time_t size_t uint8_t
        类型重定义,在定义变量之前加上typedef 变量名就编程了这种类型
        注意:不是替换关系
        typedef int num;类型重定义
        #defint int num;定义一个宏 把所有的num替换成int
<think>我们之前讨论了`pthread_self()`函数,现在用户询问的是Linux系统中的数据类型。根据引用内容,我们可以了解到Linux C的数据类型分类和一些基本类型的大小。 用户的问题:我想了解Linux系统中的数据类型 根据引用[1]中的内容,Linux C的数据类型分为: 1. 基本类型(整型、浮点型、字符型、枚举型) 2. 构造类型(数组类型、结构体类型、共用体类型) 3. 指针类型 4. 空类型 同时,引用[1]还给出了基本类型的一些具体类型和大小(在32位系统中): - 整型: - 基本型(int,4字节) - 长整型(long,4字节) - 短整型(short,2字节) - 无符号整型(unsigned,2字节) 注意:这里无符号整型通常指unsigned int,但大小可能和int相同,而引用中写的是2字节,这可能是针对16位系统或特定环境。在32位及以上系统中,int和unsigned int通常为4字节。 引用[3]提到,在头文件`sys/types.h`中定义了一些基本系统数据类型,如`pid_t`,它实际上是`int`的别名。 因此,我们可以这样组织回答: ### Linux系统中的数据类型 Linux C 中的数据类型可以分为以下几类: #### 1. 基本类型 - **整型**:用于表示整数,包括: - `int`:基本整型,通常为4字节(32位系统)或8字节(64位系统)[^1] - `short`:短整型,通常为2字节 - `long`:长整型,通常为4字节(32位系统)或8字节(64位系统) - `long long`:更长的整型,通常为8字节(C99标准) - 无符号版本:`unsigned int`、`unsigned short`、`unsigned long`等,表示非负整数 - **浮点型**:用于表示实数,包括: - `float`:单精度浮点型,通常为4字节 - `double`:双精度浮点型,通常为8字节 - `long double`:扩展精度浮点型,通常为10字节或16字节 - **字符型**:`char`,通常为1字节,用于表示字符或小整数(-128~127或0~255) - **枚举型**:`enum`,定义一组命名的整数常量 #### 2. 构造类型 - **数组类型**:相同类型元素的集合,如`int arr[10]` - **结构体类型**:`struct`,不同类型元素的集合 - **共用体类型**:`union`,所有成员共享同一块内存空间 #### 3. 指针类型 用于存储内存地址,如`int *p`,指针的大小与系统架构有关(32位系统为4字节,64位系统为8字节) #### 4. 空类型 `void`,表示无类型,通常用于函数返回值或指针类型 #### 系统定义的数据类型 在`sys/types.h`等头文件中,Linux系统还定义了一些与系统相关的数据类型,例如: - `pid_t`:进程ID的类型,实际上是`int`[^3] - `size_t`:表示对象大小的无符号整数类型(通常是`unsigned long`或`unsigned long long`) - `ssize_t`:有符号的`size_t`(通常为`long`) - `off_t`:文件偏移量的类型(通常为`long`或`long long`) #### 示例:数据类型大小 以下程序可以打印不同数据类型的大小: ```c #include <stdio.h> #include <sys/types.h> int main() { printf("int: %zu bytes\n", sizeof(int)); printf("short: %zu bytes\n", sizeof(short)); printf("long: %zu bytes\n", sizeof(long)); printf("long long: %zu bytes\n", sizeof(long long)); printf("float: %zu bytes\n", sizeof(float)); printf("double: %zu bytes\n", sizeof(double)); printf("char: %zu bytes\n", sizeof(char)); printf("void*: %zu bytes\n", sizeof(void*)); // 指针类型 printf("pid_t: %zu bytes\n", sizeof(pid_t)); // 系统数据类型 return 0; } ``` #### 注意事项 1. 数据类型的大小可能随系统架构(如32位或64位)和编译器而变化,可以使用`sizeof`运算符获取具体大小[^1]。 2. 引用[2]提到,Linux C对大小写敏感,变量命名习惯用小写。 §§相关问题§§ 1. 如何确定在特定系统中数据类型的大小? 2. `sys/types.h`中定义的系统数据类型有哪些? 3. 为什么在64位系统中指针类型的大小是8字节? </think>### Linux系统中的数据类型详解 Linux系统中的数据类型主要分为以下几类,遵循C语言标准并包含系统级扩展: #### 一、基本数据类型 1. **整型**: - `int`:4字节(32位系统)或8字节(64位系统)[^1] - `short`:2字节(短整型) - `long`:4字节(长整型) - `long long`:8字节(C99标准) - 无符号类型:`unsigned int`, `unsigned long`等 2. **浮点型**: - `float`:4字节(单精度) - `double`:8字节(双精度) - `long double`:16字节(扩展精度) 3. **字符型**: - `char`:1字节,存储ASCII字符或小整数(-128~127) - `wchar_t`:宽字符(4字节),支持Unicode #### 二、系统专用类型(定义于`<sys/types.h>`) 1. **进程/线程相关**: ```c pid_t // 进程ID(实际为int类型)[^3] pthread_t // POSIX线程ID(通常为unsigned long) uid_t // 用户ID gid_t // 组ID ``` 2. **文件/内存相关**: ```c size_t // 对象大小(无符号整型) ssize_t // 带符号的size_t off_t // 文件偏移量(通常为long) mode_t // 文件权限模式 ``` #### 三、构造数据类型 1. **数组**:同类型元素集合,如`int arr[10]` 2. **结构体**(`struct`):异构数据聚合 ```c struct example { int id; char name[20]; }; ``` 3. **共用体**(`union`):共享内存空间的不同类型 ```c union data { int i; float f; }; ``` #### 四、指针类型 - 内存地址引用:`int *ptr` - 特殊指针: - `void*`:通用指针类型 - `NULL`:空指针常量 #### 五、类型限定符 1. `const`:定义不可修改的常量 ```c const int MAX = 100; // 不可修改的常量 ``` 2. `volatile`:防止编译器优化(用于硬件寄存器访问) #### 六、数据类型大小验证 使用`sizeof`运算符获取确切大小: ```c #include <stdio.h> int main() { printf("int size: %zu bytes\n", sizeof(int)); printf("pid_t size: %zu bytes\n", sizeof(pid_t)); return 0; } ``` 输出示例(64位系统): ``` int size: 4 bytes pid_t size: 4 bytes ``` #### 注意事项 1. **大小写敏感**:`int`与`Int`被视为不同类型[^2] 2. **平台差异**:数据类型大小随架构变化(如`long`在32/64位系统不同) 3. **类型转换**:隐式转换可能导致精度损失,需显式强制转换: ```c double d = 3.14; int i = (int)d; // 显式转换为整型 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值