您的位置:首页 > 编程语言 > C语言/C++

C语言之内存分配例题详解

2014-07-09 22:01 323 查看
1、C中内存分为四个区
  栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。
  堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一  直占着不放,导致内存泄露。
  全局:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。   

例1. 输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值。

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. [b] 已知一个数组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));    //[b]在堆区分配内存(分配方式:数组元素个数*类型字节长度)
avg = sum/[/b]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);              [b]//最后不要忘了释放内存[/b][/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: