zoukankan      html  css  js  c++  java
  • 学点 C 语言(23): 数据类型 给指针分配内存


    C 语言的内存分配很简单: malloc、calloc、realloc、free

    malloc(字节数); 返回内存段的首地址, void 的.

    calloc(个数, 类型大小); 和 malloc 的区别就是它会初始化内存为空.

    realloc(原指针, 字节数); 重新分配由 malloc、calloc 分配的内存; 这里有太多注意事项:
    1、如果缩小了, 会截掉一块, 会保留前面的内容;
    2、如果扩大了, 仍会保留已有的内容, 但新加的内存不会初始化;
    3、在扩大时, 有可能内存地址会变化, 这样原来的指针就废了, 不过返回值是新指针, 所以继续使用的应该是返回值.

    如果分配失败会返回 NULL, 一般是因为内存不足; 分配 0 字节内存也会返回 NULL 但这没有意义.

    它们都是用 free(指针) 释放.


    1. 给一个整数分配内存:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        int *p = NULL;
    
    //    p = malloc(sizeof(int));  /* 应该像下一句同时类型转换, 不然在 C++ 里面不行 */
        p = (int *)malloc(sizeof(int));
        
        *p = 100;
        printf("%d\n", *p);
        
        free(p);
        
        getchar();
        return 0;
    }
    

    2. 给 3 个整数分配内存:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        int *p = NULL;
        
        p = (int *)malloc(sizeof(int)*3);
        
        *p = 111;
        *(p+1) = 222;
        *(p+2) = 333;
    
        printf("%d,%d,%d\n", *p, *(p+1), *(p+2));
    
        free(p);
        getchar();
        return 0;
    }
    

    3. 像数组一样使用:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        int *p = (int *)malloc(sizeof(int)*3);
    
        p[0] = 111;
        p[1] = 222;
        p[2] = 333;
    
        printf("%d, %d, %d\n", p[0], p[1], p[2]);
    
        free(p);
        getchar();
        return 0;
    }
    

    4. calloc 会同时初始化内存, malloc 则不会, 不初始化应该更快些:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        const int num = 10;
    
        // calloc 和 malloc 参数也有点区别
        long *p1 = (long *)calloc(num, sizeof(long));  /* 会初始化   */
        long *p2 = (long *)malloc(num * sizeof(long)); /* 不会初始化 */
    
        int i;
        for (i = 0; i < num; i++) {
            printf("%d, %d\n", p1[i], p2[i]);
        }
    
        free(p1);
        free(p2);
        getchar();
        return 0;
    }
    

    5. realloc:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        int num = 10;
        int i;
        
        long *p = (long *)malloc(num * sizeof(long));
        printf("内存地址: %p\n~~~~~~~~\n", p);
        
        for (i = 0; i < num; i++) p[i] = i+1;
        for (i = 0; i < num; i++) printf("%d\n", p[i]);
    
        printf("------------------\n");
    
        num = 4;
        p = (long *)realloc(p, num*sizeof(long));
        printf("内存地址: %p\n~~~~~~~~\n", p);
        for (i = 0; i < num; i++) printf("%d\n", p[i]);
    
        printf("------------------\n");
    
        num = 20;
        p = (long *)realloc(p, num*sizeof(long));
        printf("内存地址: %p\n~~~~~~~~\n", p);
        for (i = 0; i < num; i++) printf("%d\n", p[i]);
    
        free(p);
        getchar();
        return 0;
    }
    

    6. 判断内存是否分配成功:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        int *p = (int *)malloc(100);
    
        if (p != NULL) printf("分配成功!\n");
        if (p) printf("分配成功!\n");
    
        if (p == NULL) printf("内存不足!\n");
        if (!p) printf("内存不足!\n");
    
        free(p);
        getchar();
        return 0;
    }
    

  • 相关阅读:
    调试脚本
    if [ $? -eq 0 ]的含义
    主键和索引的区别
    Docker守护式容器
    Docker容器的基本操作
    Linux下Docker的安装
    Linux下查看占用CPU资源最多的几个进程
    报错:pymysql.err.InternalError: (1054, "Unknown column 'AType' in 'field list'")
    在webpack中使用postcss-px2rem的
    vue环境配置脚手架环境搭建vue工程目录
  • 原文地址:https://www.cnblogs.com/del/p/1342966.html
Copyright © 2011-2022 走看看