C语言之动态存储分配函数

所谓动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。

 

动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。

 

ANSI标准规定有4个有关的动态存储分配的函数,即calloc()、malloc()、free()、realloc()。

ANSI标准要求动态分配系统返回void指针。void指针具有一般性,它们可以指向任何数据类型,相当与Objective—C中的id数据类型(可以指向任何对象)。



#include<stdio.h>
#include<stdlib.h>
int main()
{
    void assignment(int i3[],int i1);
    void sort(int i3[],int i1);
    void serach(int i3[],int i1);
    int length;
    int *array;
    
    printf("请输入数组长度:\n");
    scanf("%d",&length);//1:scanf()输入库函数需要&取地址符, 
    array=(int *)malloc(length*sizeof(int));//动态分配内存空间 
    
    assignment(array,length);
    sort(array,length);
    serach(array,length);
    
    free(array);//手动释放指针array指向的内存空间,否则造成内存泄漏
    
    
    //return 0;  3:在这里return()函数一旦调用直接推出main()函数,return()函数退出当前函数体 ,返回参数值或者程序正常执行的数字0 
    
    //赋值
    void assignment(int array[],int length)
    {
         int x;
         for( x=0;x<length;x++)// 2:X声明错误,在C语言中,先声明后使用;在C++、java等中可以直接在循环体中声明使用 
         {
             array[x]=rand()%100;//取100以内的随机数 
         }
         printf("赋值后,数组是:\n");
         for(x=0;x<length;x++)
         {
             printf("%d\n",array[x]);
         }
         return;
    }
    
    //排序
    void sort(int array[],int length)
    {
         int k,temp,i;//4: index不需要,详看冒泡排序 
         for(k=0;k<length-1;k++)//4: n个数字需要n-1次排序,i1为数组长度,按照下标访问(要减去1),判定条件是<i1-1 
         {
             //index=k;
             for(i=0;i<length-1-k;i++)
             {
                  if(array[i]>array[i+1])//这是从小到大,升序排序 
                  {
                      temp=array[i];
                      array[i]=array[i+1];
                      array[i+1]=temp;
                  }
             }
         }
         printf("排序后是:\n");
         int x;
         for(x=0;x<length;x++)
         {
             printf("%d\n",array[x]);
         }
          return;
     }
    
     //查找
     void serach(int array[],int length)
     {
          int x,high,low,mid;//x的值随机都可以,不需设为0 
          printf("输入要查找的指定整数:");
          scanf("%d",&x);
          
          //设置循环条件 
          low=0;
          high=length-1;
          
          //采用二分法在有序数组中查找数据 
          while(low<=high)
          {
              mid=(low+high)/2;
              if(array[mid]==x)//查找数值是中间那个数值 
              break;
              else if(x<array[mid])
              {
                   high=mid-1;
              }
              else
              {
                  low=mid+1;
              }
          }
          if(low<=high)
          printf("数组中的位置是 %d\n",mid+1);//5 :因为数组下标访问要减1,这里是输出位置,mid要加1,正好对应 
          else printf("没有这个数字\n");
          return;
    }
    system("pause");
    return 0;   
}               


运行结果如下:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值