C语言的栈内存与堆内存
* 栈内存
* 系统自动分配
* 系统自动销毁
* 连续的内存区域
* 向低地址扩展
* 大小固定
* 栈上分配的内存称为静态内存
* 静态内存分配
* 子函数执行完,子函数中的所有局部变量都会被销毁,内存释放,但内存地址不可能被销毁,只是地址上的值没了
#include<stdio.h>
#include<stdlib.h>
/**
栈内存 系统统一分配统一回收
静态内存分配 栈内存大小固定的 内存地址是连续的
*/
int* getData(){
int array[] ={1,2,3,4,5};
printf("%#x\n",&array);
return &array;
}
int* getData2(){
int array[] ={5,4,3,2,1};
printf("%#x\n",&array);
return &array;
}
main(){
int* pointer = getData();
getData2();
printf("%d,%d,%d\n",*(pointer+0),*(pointer+1),*(pointer+2));
printf("%d,%d,%d\n",*(pointer+0),*(pointer+1),*(pointer+2));
printf("%#x\n",pointer);
system("pause");
}
* 堆内存
* 程序员手动分配
* java:new
* c:malloc
* 空间不连续
* 大小取决于系统的虚拟内存
* C:程序员手动回收free
* java:自动回收
* 堆上分配的内存称为动态内存
#include<stdio.h>
#include<stdlib.h>
/**
java new对象就会申请一块堆内存
c malloc memory allocation 内存分配
c的堆内存 程序员手动申请手动释放 malloc
free
申请一块堆内存 动态内存分配
堆内存 不连续的
堆内存大小不固定 取决机器的状态
*/
main(){
//malloc 接收的参数 申请内存大小 返回一个内存地址值 申请到的也是一块连续的内存空间
int* pointer = malloc(sizeof(int)*5);
*(pointer+0) = 1;
*(pointer+1) = 2;
*(pointer+2) = 3;
*(pointer+3) = 4;
*(pointer+4) = 5;
//C for 循环 循环的临时变量i 要先声明再使用
int i;
for(i = 0;i<5;i++){
printf("第%d个元素的值= %d\n",i,*(pointer+i));
}
free(pointer);
printf("第一个元素的值%d\n",*(pointer+0));
system("pause");
}