1.内存的管理方式
在C语言程序中,存放数据所能使用的内存空间分为4种情况:栈、堆、数据区和常量区
栈内存特点详解:1.空间实现自动管理:运行时空间自动分配,运行结束空间自动回收
2.能够被反复使用
3.脏内存
4.临时性
堆内存特点详解:1.灵活性:堆是另一种管理形式的内存区域,堆内存的管理灵活
2.内存量大:堆内存空间很大,进程可以按需手动申请,使用完手动释放。
3.程序手动申请和释放:malloc申请,free释放(malloc返回的是void* 类型的指针,无法确定malloc(0)返回何值,定义者规定)
4.脏内存
5.临时性
代码段(.text):代码段存放的是程序的代码部分,程序中的各种函数的指令就存放在该段
数据段(.data):也被称为数据区、静态数据区、静态区,存放显式初始化为非0的静态数据。
.bss段,又叫ZI段,所有未初始化的静态变量的空间开辟于此。
小结:栈、堆、静态这三种内存管理方式都可以为程序提供内存空间。栈空间用于开辟局部变量空间,实现的是自动内存管理;对于栈内存来说,程序需要malloc进行手动申请,使用完后必须使用free进行释放,实现的是手动内存管理,静态数据区的数据段,专门用于全局比那里和静态变量。
如果只是在函数内部临时使用,作用范围希望被局限在函数内部,就定义局部变量。
如果变量只是在程序的一个阶段期间有用,非常适合使用堆内存空间;如果变量需要在程序运行的整个过程中一直存在的话,适合使用全局变量。
2.C语言中的字符串类型
C语言使用指针来管理字符串 char *p="linux"
本质是:指向字符串的存放空间的指针,本质上与字符数组没有什么区别,只是使用了“\0”字符作为结尾符。
sizeof是C语言的一个关键字,使用方法为sizeof(类型或变量名),返回的是类型或者是变量所占用的字节数。用于测试不同平台下各类型所占用的字节数。
strlen是C语言一个库函数,这个函数接收一个字符串的指针,返回值为字符串的长度。且返回的字符串长度不包括“\0”
取个例子: char *p="linux"
sizeof(p)=4; 此时测试的是字符指针变量p本身的长度,与字符串的长度无关。
strlen(p)=5;计算字符串字符个数的(不包括"\0")
3.结构体概述
C语言中的两种类型:原生类型和自定义类型。结构体类型是一种自定义类型
结构体针对于数组具有定义时需明确具体大小,且不能更改以及要求所有元素类型必须一致,两个明显缺陷升级而来。
结构体对齐访问:用于配合硬件,虽然牺牲了内存空间,但是提高了访问效率。
#pragme pack(4) //4字节对齐
结构体对齐实例
struct mystruct1
{
int a; 4 4
char b; 1 1+1
short c; 2 2
};
struct stu
{
char sex; 1 4
int length; 4 4
char name[10]; 10 12
};
4.共用体
union
union mynuion
{
int a;
char b;
};
共同体中的各个成员其实是一体的,彼此不独立,使用同一个内存单元。
共同体用于那种对一个内存单元进行多种不同规则解析的情况下。
5.大小端模式
高字节对应低地址(大端模式)、高字节对应高地址(小端模式)
通信的大小端问题,先发低字节叫做小端,先发高字节叫做大端。
用union来测试机器的大小端模式
#include<stdio.h>
union mynuion
{
int a;
char b;
};
int is_little_endian(void)
{
union myunion u1;
u1.a = 1;
return u1.b;
}
int main(void)
{
int i = is_little_endian();
if (1 == i)
{
printf("小端模式\n");
}
else
{
printf("大端模式\n");
}
return 0;
}