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;
    }
    

  • 相关阅读:
    C#利用反射动态调用类及方法
    系统程序监控软件
    SQL server 2008 安装和远程访问的问题
    sql server 创建临时表
    IIS 时间问题
    windows 2008 安装 sql server 2008
    sql server xml nodes 的使用
    Window 7sp1 安装vs2010 sp1 打开xaml文件崩溃
    CSS资源网址
    Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0
  • 原文地址:https://www.cnblogs.com/del/p/1342966.html
Copyright © 2011-2022 走看看