#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();
}
c day03_ 動態內存分配
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
day_03_String
#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include <stdio.h> #inc
John__Dai
2020-06-14 15:46:41
day02_c 指針
#include <stdio.h> #include <stdlib.h> #include <Windows.h> #include<math.
John__Dai
2020-06-14 15:46:41
c_day05 聯合體-枚舉
//聯合體(共用體) //不同類型的變量共同佔用同一段內存(互相覆蓋),聯合體變量任何時候只有一個成員存在,節省內存 //聯合體變量的大小=最大成員
John__Dai
2020-06-14 15:46:31
c_day05_io
John__Dai
2020-02-21 13:39:42
07_JNI Field Method Constructor_method Exception Memory
John__Dai
2020-02-21 13:39:42
c++ 基礎之 namespace_quote
John__Dai
2020-02-21 13:39:41
eclipse下進行ndk開發步驟
John__Dai
2020-02-21 13:39:30
C_day06 c訪問java屬性和方法
John__Dai
2020-02-21 13:39:30
c_04 結構體—important
John__Dai
2020-02-21 13:39:30
c_day06_宏定義
John__Dai
2020-02-21 13:39:30
jvava 代碼創建接口 通過jni實現C的調用步驟
John__Dai
2020-02-21 13:39:30
day_03_String
#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include <stdio.h> #inc
John__Dai
2020-06-14 15:46:41