【QIUC】第一卷-CC++高级(九)- 为何要分配内存

【QIUC】第一卷-C/C++高级(九)-为何要分配内存

减少内存的浪费

即按需要而取,这里不做赘述

可以间接访问函数内部的指针的对应的地址空间

即被调用函数之外需要使用被调用函数内部的指针对应的地址空间,就是类似这里有三种方法

  1. 通过二级指针来实现

    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
    
  2. 通过分配内存而不释放来实现

    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
    
  3. 通过指针引用来实现

    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;
}

猜你喜欢

转载自blog.csdn.net/qq_51672565/article/details/114855696