c day03_ 動態內存分配

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
# include <stdlib.h>
#include<Windows.h>
//動態內存分配
/*
void main(){
//棧內存超出範圍會報 stack overflow 錯誤 棧溢出
//靜態內存分配


int a[1024 * 1024 * 10];


//c 語言內存分配
//1.棧區(stack)
//windows下 ,棧內存分配2M(確定的常數),超出限制就提示stack overflow 錯誤
//自動分配,釋放
//2 .堆區(heap)
//程序員手動代碼分配釋放 ,一般可以佔用系統80%的內存
//3.全局區或者靜態區
//4.字符常量區
//5.程序代碼區
getchar();


}


*/
/*
//棧內存
void stackFun(){
//靜態分配
int a[1024];
//棧內存自動釋放
}


//堆內存
void heapFun(){
//返回一個地址指針int類型
//void * 任意類型的指針 malloc() 返回類型 和sizeof(int) 無關
//開闢內存
int* p = malloc(1024 * 1024 * 10 * sizeof(int));  //可以通過任務管理器查看實際情況


free(p);//釋放內存
}




void main(){
//在堆內存上,分配40M的內存
malloc(1024 * 1024 * 10 * sizeof(int));  //可以通過任務管理器查看實際情況
while(1){
sleep(1000);
heapFun();        //  每一秒自動分配40M內存 
stackFun();
}
getchar();
}*/


 
//創建一個數組,動態指定數組大小(在程序運行過程中,可以根據需要動態的制定開闢內存的大小)
//靜態內存分配,分配內存大小是固定的,問題:1.很容易超出佔內存的最大值 2.爲了防止內存不夠往往開闢較多的內存從而容易浪費內存
//動態內存分配,在程序運行過程中,動態制定需要的合適大小的內存空間,手動釋放,釋放後這塊內存還可以被重複使用
//realloc 重新分配內存
/*
void main(){
//靜態內存分配創建數組  數組的大小是固定的(不可以用變量制定大小 eg  int a[i] 編譯不會通過)
//int a[10];

int len;
printf("第一次輸入數組的長度:");
scanf("%d", &len);


//int* p = malloc(len * sizeof(int));
int* p = calloc(len, sizeof(int));
int i = 0;
for (; i < len; i++){
p[i] = rand() % 100;
printf("%d,%#x\n", p[i], &p[i]);
}


int addLen;
printf("輸入數組增加的長度:");
scanf("%d", &addLen);
//內存不夠用,擴大剛剛分配的內存空間
//1.原來內存的指針 2.內存擴大之後的總大小
int* p2 = realloc(p, sizeof(int)* (len + addLen));
if (p2 == NULL){
printf("重新分配失敗,世界那麼大,容不下我。。。");
}
//重新分配內存的兩種情況:
//縮小,縮小的那一部分數據會丟失
//擴大,(連續的)
//1.如果當前內存段後面有需要的內存空間,直接擴展這段內存空間,realloc返回原指針
//2.如果當前內存段後面的空閒字節不夠,那麼就使用堆中的第一個能夠滿足這一要求的內存塊,將目前的數據複製到新的位置,並將原來的數據庫釋放掉,返回新的內存地址
//3.如果申請失敗,返回NULL,原來的指針仍然有效


//重新賦值
i = 0;
printf("--------------------------\n");
for (; i < len + addLen; i++){
p2[i] = rand() % 200;
printf("%d,%#x\n", p2[i], &p2[i]);
}


//手動釋放內存
if (p != NULL){
free(p);
p = NULL;
}
if (p2 != NULL){
free(p2);
p2 = NULL;
}


getchar();
}
*/


//內存分配的幾個注意細節
//1.不能多次釋放
//2.釋放完之後(指針仍然有值),給指針置NULL,標誌釋放完成
//3.內存泄露(p第一次賦值以後 再進行重新賦值之後,再free,並沒有真正釋放內存 ,應該在第二次賦值之前進行一次釋放)
/*
void main(){
int len;
printf("輸入數組的長度:");
scanf("%d", &len);


int* p = malloc(len * sizeof(int));
int i = 0;
for (; i < len; i++){
p[i] = rand() % 100;
printf("%d,%#x\n", p[i], &p[i]);
}


if (p != NULL){
free(p);
p = NULL;
}


getchar();
}
*/


void main(){
//40M
int* p1 = malloc(1024 * 1024 * 10 * sizeof(int));
free(p1);
p1 = NULL;
printf("%#x\n", p1);


//80M
p1 = malloc(1024 * 1024 * 10 * sizeof(int)* 2);


free(p1);
p1 = NULL;


getchar();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章