p = (int *)malloc( sizeof(int) );
malloc只管分配内存,并不会初始化,其内存空间中的值可能是随机的。
那么还有3个字节未分配空间,系统就会在已经分配的那1个字节的基础上,依次向后分配3个字节空间,而这就占有了“别人”的3个字节空间,“别人”原有的值就被清空了。
分配的空间不再使用时,要用free函数释放这块内存空间。
3、示例
分配100个int类型的空间:
int *p;
p = (int *)malloc( sizeof(int) * 100 );
柔性数组就是以这种内存空间不断的变化,来使得整个数组拥有了动态的性能,某种意义上相当于该数组柔软可变的,所以称为柔性数组。注意:若直接用这种包含柔性数组的结构体类型来创建变量,那么该结构变量相当于只有一个成员i(由于该类型结构体的大小不包含柔性数组,故在像内存申请空间时,自然也不会获得柔性数组的空间,所以该结构体变量相当于就只有一个成员i)。
————————————————
————————————————
这时候会有些小伙伴说:如果我这样子写代码不是一样可以实现么?
#include<stdio.h>
#include<stdlib.h>
int main()
{
struct S
{
char ch;
int* arr;//定义一个指针来代替柔性数组
};
struct S* s = (struct S*)malloc(sizeof(struct S));
if (s == NULL)
return 1;
s->arr = (int*)malloc(10 * sizeof(int));//分配给arr指向的空间40个字节大小的空间
if (s->arr == NULL)
return 1;
for (int i = 0; i < 10; i++)
{
s->arr[i] = i;
}
for (int i = 0; i < 10; i++)//打印
{
printf("%d ", s->arr[i]);
}
free(s->arr);//要先释放arr不然找不到arr了
s->arr = NULL;
free(s);
s = NULL;
return 0;
}
1,方便内存释放:
如果我们的代码是在一个给别人用的函数之中,你在里面做了二次内存分配,并把整个结构体返回给了用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好 了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。
2,有利于访问速度:
连续的内存有益于提高计算机的访问速度,也有益于其减少内存碎片。