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

静态内存开辟

#include 
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和动态内存开启注意事项

c基础—动态开辟内存和字符串_第1张图片
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基础—动态开辟内存和字符串)