目录

内存条:

c语言类型:

重点:


 

内存条:

kernel  内核

环境参数

栈区(系统自动分配和释放空间、顺序栈、链栈(中缀表达式及后缀表达式))

mmap映射区(映射文件描述符和指定文件的区域到调用进程的内存区域)

堆区(手动开辟和释放空间malloc / free)

.bss(为初始化的全局变量/静态变量,会自动初始化为0)

.data(初始化的全局变量/静态变量)

【.bss 和 .data 为全局变量区/静态区】

字符串常量区

.text 代码段 0-0x00000000

特点:

全局变量:浪费资源 ,效率低,访问时间长,不安全,但是生成周期长,不再需要传参等,但是这不适用于大型项目,比如说服务器,服务器要时刻保持运转,也就是说可以随时访问

局部变量:该循环或者函数中适用,比如for(int i)或是 main(){ int i; }

注意:全局变量a,当局部变量也定义了一个a,那么全局变量将在该方法中被掩盖,以局部变量为准,另外,这里可以考虑函数的传参和传地址。

malloc:开辟的空间是连续的,该空间可能含有原来的内容(脏数据),因此要用memset()函数清零,另外,当手动开辟空间后,要用free()函数释放,不然会造成内存泄露。

c语言类型:

char 1        short 2        int 4        float 4        long 8        double 8        long long 8 

long double 16  注意:不同版本大小不一样,这里是ubuntu20.04

判断结构体的大小:

 话不多说,先上代码

root@ubuntu:/Liunx/shell/shuzu# cat 112.c
/*===============================================
*   文件名称:111.c
*   创 建 者:     
*   创建日期:2022年04月26日
*   描    述:
================================================*/
#include <stdio.h>
struct data{
    char a;
    char c;
    short b;
    int d;
    double e;
}a;
int main(int argc, char *argv[])
{ 
    printf("sizeof(a)=%d\n",sizeof(a));

    return 0;
} 
root@ubuntu:/Liunx/shell/shuzu# cat -n 11.c
     1	/*===============================================
     2	*   文件名称:11.c
     3	*   创 建 者:     
     4	*   创建日期:2022年04月26日
     5	*   描    述:
     6	================================================*/
     7	#include <stdio.h>
     8	struct data{
     9	    char a;
    10	    short b;
    11	    char d;
    12	    int c;
    13	}a;
    14	int main(int argc, char *argv[])
    15	{
    16	    int b = sizeof(a);
    17	    printf("b=%d\n",b);
    18	    printf("%d\n",sizeof(short));
    19	    return 0;
    20	} 
root@ubuntu:/Liunx/shell/shuzu# cat 111.c
/*===============================================
*   文件名称:111.c
*   创 建 者:     
*   创建日期:2022年04月26日
*   描    述:
================================================*/
#include <stdio.h>
struct data{
    char a;
    short b;
    char c;
    int d;
    double e;
}a;
int main(int argc, char *argv[])
{ 
    printf("sizeof(a)=%d\n",sizeof(a));

    return 0;
} 
root@ubuntu:/Liunx/shell/shuzu# cat 112.c
/*===============================================
*   文件名称:111.c
*   创 建 者:     
*   创建日期:2022年04月26日
*   描    述:
================================================*/
#include <stdio.h>
struct data{
    char a;
    char c;
    int d;
    short b;
    double e;
}a;
int main(int argc, char *argv[])
{ 
    printf("sizeof(a)=%d\n",sizeof(a));

    return 0;
} 

试试能不能判断出占多少字节!结果为16 12 24 24。

注意:为了寻址的方便,char short char 和 char char short 所占字节数不一样,前者6,后者4,因为计算机为了寻址方便,所以当char 遇见 short 会自动将该char 变为 2,char int也类似,总之,计算机为了保持地址所占的一致性,如果前者遇见了比自己占比大的,便会自动对齐为那个比自己占比大的所占空间。

例如:

 char short  4

char int 8

char double 16

char char short 4 这里可以理解为两个char所占空间敲好于short相等

char int char short 12

char double char short 24 这里虽然char int 占四个字节,但是由于有double,因此又需对齐double         cahr 1空 double char 1空 short 4空

char char short char 6

char short int 8

=====================================================================

重点:

struct demo{};
32位机:1,占位
64位机:0,不占位
字节对齐:
①一般来讲,都是以最高位对齐
②但同时也要尽量节省空间
32位:
long    4
float    4
double    8
32位结构体中有long,有double,按4字节对齐,double占两个四字节,也就是最高4字节对齐
64位:
long    8
float    4
double    8
最高8字节对齐

那么问题来了:
为什么32位机最高是4字节对齐在,64位是8字节对齐呢?
这是因为32位机只有
32根地址线,也就是32个bit位,最高可以寻到2的32次方个字节,
32=4*8,一个字节占8个bit位,所以最高字节对齐为4
同理,64位机有
64根地址线,64=8*8,那么自然字节对齐最高为8位
为什么要字节数对齐:用空间换时间

对于内部临时需要更改的结构体对齐方式:
①#pragma pack (n),编译器将按照n 个字节对齐;
②#pragma pack (),取消自定义字节对齐方式。
注意:如果#pragma pack (n)中指定的n 大于结构体中最大成员的size,则其不起作用,结构体仍然按照size 最大的成员进行对界。
注意:
字节对齐32位最大能修改成4,64位最大为8

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐