• 16-高级指针


    目录:

    一、高级指针

    二、malloc函数

    三、calloc函数

    四、realloc函数

    回到顶部

    一、高级指针

    1 堆内存的动态内存分配。内存分为:栈区(变量)、代码区(字符串)、全局区(全局变量)、堆区(自己创建,自己回收,变量,字符串)

    2 为了从堆中动态分配内存,要指定字节个数的空间,返回首地址,如果失败,返回NULL(空)包含头文件stdlib.h,基本的内存操作都写好了。

    3 malloc函数,从堆中分配指定的字节个数的空间,返回首地址,失败返回NULL

    4 calloc函数,从堆中分配指定的字节个数的空间,把所分配的空间所有字节都清零,返回首地址,失败返回NULL

    5 realloc函数,可以调整已经分配的空间,有两种情况,如果当前位置可以调整,在原位置调整,如果当前位置不可以调整,换一个新的位置。

    6 free函数,用于释放从堆中分配的空间。

    回到顶部

    二、malloc函数

    1 引入头文件stdlib.h

    2 堆中没有变量名,只能通过指针的方式拿到内存中的数据(值)

    3 在使用堆内存指针的时候,最好使用const关键字修饰一下。int* const p;

    4 malloc函数可以分配堆内存,以字节为单位的大小。

    5 if (p != NULL) 这里避免内存分配失败,造成程序崩溃,非空验证。

    6 堆内存使用完毕后,一定要释放。free(p);

    回到顶部

    三、calloc函数

    前面跟malloc一样。。。

    7 calloc函数分配内存时,会做清零操作。

    int* p = calloc(3, sizeof(int));

    参数1是元素个数 参数2是每个元素空间

    回到顶部

    四、realloc函数

    1 调整内存空间。

    2 标准格式:realloc(p, 5*sizeof(int));

    可能出现的情况:

    realloc(NULL, 5*sizeof(int));//参数1 调整哪个空间 参数2 调整后的大小

    int* p = realloc(p, NULL);

    3 如果直接把新分配的地址,直接覆盖原来的地址,是有风险的,如果分配失败,将无法将原来的地址找到,可以分配一个新地址。如果原来位置可以调整空间,如果不可以调整,程序会自动在新的位置创建空间,并且将原来的值移动到新的空间。

    4 如果非空 就将新的位置保存到新的指针中。

    练习:(堆区)创建3个位置,保存3个数,修改十个位置,保存十个数。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 int main(int argc, const char * argv[])
     4 {
     5     //int number[3] = {0};
     6     //int* p = malloc(sizeof(int)*3);
     7     int* p = calloc(3, sizeof(int));//参数1是元素个数 参数2是每个元素空间
     8     //realloc重新分配空间
     9     int* p2 = realloc(p, 5*sizeof(int));//参数1 调整哪个空间 参数2 调整后的大小
    10     printf("p address:%p
    ",p);
    11     printf("p2 address:%p
    ",p2);
    12     //int* p = realloc(p, NULL);
    13     //printf("number address:%p
    ",number);
    14     printf("p address:%p
    ",p);
    15     if (p != NULL) {
    16         p = p2;
    17         for (int i = 0; i < 5; i++) {
    18             printf("输入一个数:
    ");
    19             scanf("%d",p + i);
    20         }
    21         for (int i = 0; i < 5; i++) {
    22             printf("%d
    ",*(p + i));
    23         }
    24     }else{
    25         printf("分配内存不成功!");
    26     }
    27     free(p);//释放内存,否则会内存泄露
    28     return 0;
    29 }
  • 相关阅读:
    os.environ的详解
    request.headers.get头部获取内容的缺失
    mysql根据逗号分割的字符串去关联查询另外一个表的数据
    Flask路由中使用正则表达式匹配
    Mac OS下安装mysqlclient遇到的一些坑
    【uWSGI】 listen queue of socket (fd: 3) 错误分析
    redis zset底层实现原理
    计算机网络05 传输层
    计算机网络04 网络层
    计算机网络03 数据链路层
  • 原文地址:https://www.cnblogs.com/yangmx/p/3474611.html
Copyright © 2020-2023  润新知