摘录「 malloc函数用法」2023年12月17日

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
    #include
    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,有利于访问速度:
连续的内存有益于提高计算机的访问速度,也有益于其减少内存碎片。

 

你可能感兴趣的:(笔记)