网站建设丿金手指下拉,asp网站安装,北京网络推广套餐,为什么网站经常被攻击柔性数组1. 柔性数组介绍2. 柔性数组特点3. 用例3.1 代码一#xff1a;3.2 代码二#xff1a;4. 柔性数组优势#xff1a;1. 柔性数组介绍 也许你从来没有听说过柔性数组#xff08;flexible array#xff09;这个概念#xff0c;但是它确实是存在的。 C99 中#xff0c…
柔性数组1. 柔性数组介绍2. 柔性数组特点3. 用例3.1 代码一3.2 代码二4. 柔性数组优势1. 柔性数组介绍 也许你从来没有听说过柔性数组flexible array这个概念但是它确实是存在的。 C99 中结构中的最后一个元素允许是未知大小的数组这就叫做『柔性数组』成员。 例如零长度数组概念
struct S
{int n;char c;int arr[];//柔性数组成员
};
有些编译器无法编译可以改成
struct S
{int n;char c;int arr[0];//柔性数组成员
};
2. 柔性数组特点 结构中的柔性数组成员前面必须至少一个其他成员。 sizeof 返回的这种结构大小不包括柔性数组的内存。 包含柔性数组成员的结构用malloc ()函数进行内存的动态分配并且分配的内存应该大于结构的大小 以适应柔性数组的预期大小。
3. 用例
3.1 代码一 //代码一
struct S
{int n;char c;int arr[];
};
int main()
{struct S* ps (struct S*)malloc(sizeof(struct S) 10 * sizeof(int));//设置int arr数组元素为10个10*sizeof(int)if (ps NULL){printf(%s\n, strerror(errno));return 1;}ps-n 100;ps-c w;for (int i 0;i 10;i){ps-arr[i] i;}for (int i 0;i 10;i){printf(%d\n, ps-arr[i]);}free(ps);ps NULL;
}
3.2 代码二 //代码二
struct S
{int n;char c;int* arr;
};int main()
{struct S* ps (struct S*)malloc(sizeof(struct S));if (ps NULL){perror(malloc);return 1;}int*ptr (int*)malloc(10 * sizeof(int));//设置int arr数组元素为10个10*sizeof(int)if (ptr NULL){perror(malloc2);return 1;}else{ps-arr ptr;}//使用ps-n 100;ps-c w;int i 0;for (i 0; i 10; i){ps-arr[i] i;}//打印for (i 0; i 10; i){printf(%d , ps-arr[i]);}//扩容 - 调整arr的大小ptr realloc(ps-arr, 20 * sizeof(int));//增容int arr数组元素为20个10*sizeof(int)if (ptr NULL){perror(realloc);return 1;}else{ps-arr ptr;}//使用ps-n 100;ps-c w;for (i 0; i 20; i){ps-arr[i] i;}//打印for (i 0; i 20; i){printf(%d , ps-arr[i]);}//释放free(ps-arr);ps-arr NULL;free(ps);ps NULL;return 0;
}4. 柔性数组优势
代码一和代码二都可以完成相同功能但代码一有以下两个好处
第一个好处是方便内存释放。 如果我们的代码是在一个给别人用的函数中你在里面做了二次内存分配并把整个结构体返回给用户。 用户调用free可以释放结构体但是用户并不知道这个结构体内的成员也需要free所以你不能指望用户来发现这个事。 所以如果我们把结构体的内存以及其成员要的内存一次性分配好了并返回给用户一个结构体指针用户做一次free就可以把所有的内存也给释放掉。 第二个好处是这样有利于访问速度。 连续的内存有益于提高访问速度也有益于减少内存碎片。 其实我个人觉得也没多高了反正 你跑不了要用做偏移量的加法来寻址 补充局部性原理 局部性原理是计算机科学中的一种基本原理指的是程序中的指令和数据在执行时会集中在较小的一部分存储器中并且在短时间内重复使用。这种局部性表现在两个方面时间局部性和空间局部性。 时间局部性指的是某个数据或指令一旦被使用在短时间内会被多次使用。例如在循环结构的程序中循环体内的指令会被反复执行。 空间局部性指的是某个数据或指令的使用会对其周围的数据与指令产生影响这些数据和指令也会在短时间内被多次使用。例如在数组操作中相邻的元素都会被频繁地访问。 局部性原理的应用可以提高计算机系统的性能例如通过缓存技术和虚拟内存技术让系统可以快速地访问常用的数据和代码从而减少了额外的访问时间和存储开销。 感谢阅读