做门票售卖网站,大型网站建设建设公司排名,杭州网站建设seo优化,简述什么是seo柔性数组和C语言内存划分 1. 柔性数组1.1 柔性数组的特点#xff1a;1.2 柔性数组的使用1.3 柔性数组的优势 2. 总结C/C中程序内存区域划分 1. 柔性数组
也许你从来没有听说过柔性数组#xff08;flexible array)这个概念#xff0c;但是它确实是存在的。
C99 中#xff… 柔性数组和C语言内存划分 1. 柔性数组1.1 柔性数组的特点1.2 柔性数组的使用1.3 柔性数组的优势 2. 总结C/C中程序内存区域划分 1. 柔性数组
也许你从来没有听说过柔性数组flexible array)这个概念但是它确实是存在的。
C99 中结构中的最后⼀个元素允许是未知大小的数组这就叫做『柔性数组』成员。
例如
typedef struct st_type
{int i;int a[0];//柔性数组成员
}type_a;有些编译器会报错⽆法编译可以改成
typedef struct st_type
{int i;int a[];//柔性数组成员
}type_a;1.1 柔性数组的特点
结构中的柔性数组成员前面必须至少⼀个其他成员。sizeof 返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构⽤malloc ()函数进行内存的动态分配并且分配的内存应该大于结构的大小以适应柔性数组的预期大小。
#include stdio.h
struct St
{int n;int arr[0];
};int main()
{printf(%zd\n, sizeof(struct St));return 0;
}运行结果如图:
1.2 柔性数组的使用
#include stdio.h
#include stdlib.h
struct St
{char c;int n;int arr[0];
};int main()
{struct St* ps (struct St*)malloc(sizeof(struct St) 10 * sizeof(int));if (ps NULL){perror(malloc);return 1;}ps-c w;ps-n 100;int i 0;for (i 0; i 10; i){ps-arr[i] i;}//数组空间不够struct St* ptr (struct St*)realloc(ps, sizeof(struct St) 15 * sizeof(int));if (ptr ! NULL){ps ptr;}else{perror(realloc);return 1;}//...继续使用for (i 10; i 15; i){ps-arr[i] i;}for (i 0; i 15; i){printf(%d , ps-arr[i]);}printf(\n);printf(%d\n, ps-n);printf(%c\n, ps-c);//释放free(ps);ps NULL;return 0;
}运行结果如图:
1.3 柔性数组的优势
我们也可以模拟实现柔性数组的效果,代码如下:
#include stdio.h
#include stdlib.h
typedef struct St
{char c;int n;int* arr;
}st;
int main()
{st* ps (st*)malloc(sizeof(st));if (ps NULL){perror(malloc);return 1;}ps-c w;ps-n 100;ps-arr (int*)malloc(10 * sizeof(int));if (ps NULL){perror(malloc);return 1;}int i 0;for (i 0; i 10; i){ps-arr[i] i;}//扩容int* tmp (int*)realloc(ps-arr, 15 * sizeof(int));if (tmp ! NULL){ps-arr tmp;tmp NULL;}else{perror(realloc);return 1;}//使用for (i 10; i 15; i){ps-arr[i] i;}for (i 0; i 15; i){printf(%d , ps-arr[i]);}printf(\n);printf(%d\n, ps-n);printf(%c, ps-c);//释放free(ps-arr);ps-arr NULL;free(ps);ps NULL;return 0;
}运行结果如图:
上述 代码1 和 代码2 可以完成同样的功能但是 方法1 的实现有两个好处
第一个好处是方便内存释放 如果我们的代码是在⼀个给别⼈⽤的函数中你在里面做了⼆次内存分配并把整个结构体返回给用户。用户调用free可以释放结构体但是用户并不知道这个结构体内的成员也需要free所以你不能指望用户来发现这个事。所以如果我们把结构体的内存以及其成员要的内存⼀次性分配好了并返回给用户⼀个结构体指针用户做⼀次free就可以把所有的内存也给释放掉。
第二个好处是这样有利于访问速度. 连续的内存有益于提⾼访问速度也有益于减少内存碎片。
2. 总结C/C中程序内存区域划分 C/C程序内存分配的几个区域
栈区stack在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中效率很高但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。堆区heap⼀般由程序员分配释放 若程序员不释放程序结束时可能由OS回收 。分配方式类似于链表。数据段静态区static存放全局变量、静态数据。程序结束后由系统释放。代码段存放函数体类成员函数和全局函数的二进制代码。