【QIUC】第一卷-C/C++高级(九)-为何要分配内存
减少内存的浪费
即按需要而取,这里不做赘述
可以间接访问函数内部的指针的对应的地址空间
即被调用函数之外需要使用被调用函数内部的指针对应的地址空间,就是类似这里有三种方法
-
通过二级指针来实现
void demo1(int count, int** pointer_P) { int* ap = NULL; *pointer_p = (int*)malloc(sizeof(int) * count); ap = *pointer_p; for (int i = 0; i < count; i++) { ap[i] = 100 + i; } for (int i = 0; i < count; i++) { printf("%d ", *(ap + i)); } printf("\n"); } int main(){ int count = 10; int *pointer=NULL; demo1(count, &pointer); //指针的地址 for(int i=0; i < count ; i++){ printf("%d ",*(pointer+i)); } free(pointer); } //最后输出结果是 //100,101,102,103,104,105,106,107,108,109 //100,101,102,103,104,105,106,107,108,109
-
通过分配内存而不释放来实现
int* demo1(int count) { int* ap = NULL; ap = (int *)malloc(sizeof(int) * count); for(int i = 0; i < count; i++){ ap[i-1] = 100 + i; } for(int i=0; i<count; i++){ printf("%d ", *(ap + i)); } printf("\n"); return ap;//返回的是分配的内存的地址,便可以访问 } int main(){ int count = 10; int *pointer=NULL; pointer = demo(count); for(int i=0; i < count ; i++){ printf("%d ",*(pointer+i)); } free(pointer); } //最后输出结果是 //100,101,102,103,104,105,106,107,108,109 //100,101,102,103,104,105,106,107,108,109
-
通过指针引用来实现
void demo1(int count, int*& pointer_p) { int* ap = NULL; pointer_p = (int*)malloc(sizeof(int) * count); ap = pointer_p; for (int i = 0; i < count; i++) { ap[i] = 100 + i; } for (int i = 0; i < count; i++) { printf("%d ", *(ap + i)); } printf("\n"); } int main() { int count = 10; int* pointer = NULL; demo1(count, pointer); for (int i = 0; i < count; i++) { printf("%d ", *(pointer + i)); } free(pointer); } //最后输出结果是 //100,101,102,103,104,105,106,107,108,109 //100,101,102,103,104,105,106,107,108,109
突破栈空间,调用更大的堆空间
在Windows中,栈空间的大小一般只有1 ~ 2M,而堆空间可以有1 ~ 2G
void demo() {
int a1[102400 * 2]; //100k*2*4 = 800K//可以实现
int a1[102400 * 3]; //100k*3*4 = 1.2M//出错
//Stack overflow
//这是系统的回答
//函数使用了堆栈的“1228800”个字节 : 超过了 / analyze : stacksize '16384'。 请考虑将某些数据移到堆中。
int* a2=NULL;
a2 = (int*)malloc((int)(1024 * 1000 * 1000 * 1.5));
a2[0]=0;
//可以实现
int* a3=NULL;
a3 = (int*)malloc((int)(1024 * 1000 * 1000 * 2));
a3[0]=0;
//出现错误
//+a3 0x00000000 {??? int * 说明分配失败
printf("调用成功\n");
}
int main() {
demo();
return 0;
}