美文网首页c/c++我爱编程
c基础—动态开辟内存和字符串

c基础—动态开辟内存和字符串

作者: Peakmain | 来源:发表于2018-06-11 22:44 被阅读7次

    静态内存开辟

    void staticlloc(){
        int arr[int(1024*1024*0.2)];//开8m
        int i = 0;
        for (; i < 5; i++){
            arr[i] = i;
            printf("%d %p\n", *(arr + i), arr + i);
        }
    }
    //内存开辟
    void main(){
        //Stack overflow栈溢出
        //int arr[10*1024*1024] ;//10M ,int占4字节,一共40M
        //栈:占用内存空间最大值:2M  开辟的方式是静态内存开辟,int arr{10*1024*1024}方法结束后自动回收
        //堆:占用内存空间最大值 80%   开辟的方式是动态内存开辟   不会自动回收必须手动回收
        while (true){
            Sleep(100);
            staticlloc();
        }
    
        getchar(); 
    }
    

    动态开辟内存(malloc,free)

    //动态开辟内存
    void main(){
    int* arr=(int*)malloc(10 * 1024 * 1024 * sizeof(int));//40M
    //释放
    free(arr);
    getchar();
    }
    

    realloc和动态内存开启注意事项

    realloc.png
    //改变内存空间大小
    void main(){
        int num;
        printf("请输入数的个数");
        //获取用户输入的值
        scanf_s("%d", &num);
    
        int* arr = (int*)malloc(sizeof(int)*num);
        int i = 0;
        for (; i < 5; i++){
    
            arr[i] = i;
        }
    
        printf("开辟内存的指针:%p\n", arr);
        printf("请输入新增的个数");
        //realloc改变内存空间大小
    
        int new_num;
        scanf_s("%d", &new_num);
    
        //原来那块的内存的值 ,总的大小(原来的大小+新的大小)
        int *new_arr = (int *)realloc(arr, sizeof((int)(num + new_num)));
        if (new_arr){//若不为空 相当于if(new_arr!=NULL)
            i = new_num;//原来的内存可以不用赋值
            for (; i < num + new_num; i++){
                arr[i] = i;
            }
            printf("新开辟内存的指针:%p\n", new_arr);
    
            //打印数组
            for (; i < num + new_num; i++){
                printf("%d,%p/n", *(arr + i), arr + i);
            }
        }
        if (new_arr){
            //释放内存,因为新增指针和之前指针是一样的
            free(new_arr);
            new_arr = NULL;
        }
        else{
            //如果没有成功释放原本的
            free(arr);
        }
        //不要反复去释放,那块地址一旦释放,就有可能被新的应用占用,不要再次释放
        //free();
    
        getchar();
        //结束后暂停
        system("pause");
    }
    

    相关文章

      网友评论

        本文标题:c基础—动态开辟内存和字符串

        本文链接:https://www.haomeiwen.com/subject/rzjfeftx.html