zoukankan      html  css  js  c++  java
  • C语言 二级指针内存模型②

    //二级指针第二种内存模型
    
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    //打印数组
    int printfArr(char **pin,int *num){
        int ERRO_MSG = 0;
        if (pin==NULL)
        {
            ERRO_MSG = 1;
            printf("pin==NULL erro msg:%d
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        if (num == NULL)
        {
            ERRO_MSG = 2;
            printf("num == NULL erro msg:%d
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        int i = 0;
        for (i = 0; i < *num; i++)
        {
            printf("%s
    ", pin[i]);
        }
        return ERRO_MSG;
    }
    
    //释放内存
    int freeMalloc(char **pin, int *num){
        int ERRO_MSG = 0, i = 0;
        if (pin == NULL)
        {
            ERRO_MSG = 1;
            printf("pin==NULL erro msg:%d
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        if (num == NULL)
        {
            ERRO_MSG = 2;
            printf("num == NULL erro msg:%d
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        for (i = 1; i < *num; i++)
        {
            if (pin[i]!=NULL)
            {
                free(pin[i]);
                pin[i] = NULL;//防止产生野指针
            }
        }
        //在这里释放pArray的内存也是可以的,pin是pArray的一个副本,但是pin和pArray都指向同一块内存
        //free()是释放指针所指向的内存空间,
        //这还是有个缺点,给pin==NULL对pArray没有影响,还是可能产生野指针,
        //所以最好不要在被调用函数里释放
        /*if (pin != NULL)
        {
            free(pin);
        }*/
        return ERRO_MSG;
    }
    
    void main(){
        int num = 5;
        char ** pArray = (char **)malloc(num*sizeof(char *));
        memset(pArray, 0, num*sizeof(char *));
        //注释:malloc()函数是在堆上分配一块内存空间,返回这个内存空间的地址
        //100*sizeof( char *)是指分配了 100个 char *类型大小的内存空间
        //(char **)是将malloc()返回的内存空间地址 转化为一个char **类型的指针
        //char ** pArray 说明pArray指向的是一个char * 类型的数据,说明pArray的步长是 sizeof(char *) = 4
        //注意:这里计算机并不知道malloc()函数分配的内存从哪里结束,只知道分配的内存从哪里开始
        //所以 在进行 pArray+1 加法操作的时候一定要注意malloc()分配内存的大小,不要越界
        *(pArray + 0) = (char *)malloc(sizeof(char)*12);
        //等价于 pArray[0] = (char *)malloc(sizeof(char)* 12);
        pArray[1] = (char *)malloc(sizeof(char)* 20);
        pArray[2] = (char *)malloc(sizeof(char)* 20);
        pArray[3] = (char *)malloc(sizeof(char)* 20);
        pArray[4] = (char *)malloc(sizeof(char)* 20);
        //错误的赋值方法
        //pArray[0] = "aaa";已经改变指针pArray[0]的指向了,赋值操作之后pArray[0]指向是一个全局区的字符串
        //全局区的字符串是个常量,不可以修改,不可以free
        /*pArray[0] = "aaa";
        pArray[1] = "bvbb";
        pArray[2] = "ssss";
        pArray[3] = "eee";
        pArray[4] = "atttaa";*/
        strcpy(pArray[0], "111");
        strcpy(pArray[1], "222");
        strcpy(pArray[2], "333");
        strcpy(pArray[3], "444");
        strcpy(pArray[4], "5asfa");
        //打印数组
        printfArr(pArray, &num);
        //释放内存
        freeMalloc(pArray, &num);
        if (pArray != NULL)
        {
            free(pArray);
            pArray = NULL;
        }
        system("pause");
    }
  • 相关阅读:
    HDU 3416 Marriage Match IV(SPFA+最大流)
    asp.net一些很酷很实用的.Net技巧
    asp.net部分控件使用和开发技巧总结
    ASP_NET Global_asax详解
    asp.net 多字段模糊查询代码
    Asp.net中防止用户多次登录的方法
    SQL Server 事务、异常和游标
    有关Cookie
    asp.net 连接sql server 2005 用户 'sa' 登录失败。asp.net开发第一步连接的细节问题
    asp.net生成高质量缩略图通用函数(c#代码),支持多种生成方式
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5368573.html
Copyright © 2011-2022 走看看