《C语言内核深度解析》学习笔记之数组&字符串&结构体&共用体&枚举(第五章)

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

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;
}

 

你可能感兴趣的:(C语言,学习笔记)