首页 > 代码库 > C语言之内存分配例题详解
C语言之内存分配例题详解
栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。
堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一 直占着不放,导致内存泄露。
全局:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。
int n; //类型定义的都是在栈区
scanf("%d",&n);
int a[] = {0};
int *p;
p = a;
p = malloc(n*sizeof(int)); //在堆区分配内存(分配方式:数组元素个数*类型字节长度)
for (int i = 0; i < n; i++) {
*(p+i)= arc4random()%10+1;
}
int max = 0;
for (int j = 0; j < n; j++) {
if (max < *(p+j)) {
max = *(p+j);
}
}
printf("%d\n",max);
free(p); //最后不要忘了释放内存
例2. 已知一个数组20个元素(随机1到100之间包含1和100),求大于平均数的元素个数,并动态生成一个新数组保存(提示:malloc出20个元素保存)
int a[20] = {0};
int sum = 0;
for (int i = 0; i < 20; i++) {
a[i] = arc4random()%100+1; //随机分配20个(1,100)的随机数
sum = sum + a[i];
}
int b[20];
int avg = 0;
int *p;
p = b;
p = malloc(20*sizeof(int)); //在堆区分配内存(分配方式:数组元素个数*类型字节长度)
avg = sum/20;
int k = 0;
for (int j = 0; j < 20; j++) {
if (a[j] > avg) {
*(p+k) = a[j];
k++;
}
}
for (int i = 0; i < k; i++) {
printf("%d\n",*(p+i));
}
free(p); //最后不要忘了释放内存