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

时间:2022-10-31 01:30:52

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.  已知一个数组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);              //最后不要忘了释放内存