zoukankan      html  css  js  c++  java
  • C语言 动态数组实现

    一、概述

    C语言是不能直接定义动态数组的,数组必须在初始化时确定长度。

    如果要在程序运行时才确定数组的长度,就需要在运行的时候,自己去向系统申请一块内存用动态内存分配实现动态数组。

    二、动态内存分配函数

    1、malloc()函数

    void *malloc(unsigned int size)
    

    分配size个字节的内存空间,返回地址的指针,如果内存不够分,就返回空指针NULL。 注意:返回的指针是没有类型的,所以要使用得强制类型转换。

    2、calloc()函数

    void *calloc(unsigned int num, unsigned int size)
    

    这个也是申请动态内存空间,不过就是分开了而已。 一共申请num个长度为size字节的内存空间。

    3、free()函数

    void free(void *p)
    

    释放指针p内存空间。

    这个很重要!!!!很重要!!!重要!!!

    4、realloc()函数

    void *realloc(void *p, unsigned int size)
    

    给指针p申请的存储空间改为size个字节,返回的是存储空间首地址(指针)

    三、动态数组实现

    1、一维动动数组实现

    dynamicArrayOneDimensional.c

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
    #include <stdio.h>
    #include <stdlib.h>
    
    /**************************************************
    dynamicArrayOneDimensional.c
    输入N个数,求平均数
    **************************************************/
    main()
    {
      int *p = NULL, n, i, sum;
      printf("Please enter array size:");
      scanf("%d", &n);
    
      /* 申请地址n个长度为sizeof(int)的连续存储空间 */
      p = (int *)malloc(n * sizeof(int));
    
      if(p == NULL)
      {
          printf("No enough memory!
    ");
          exit(0);
      }
    
      printf("Please enter the score:");
      for(i = 0; i<n; i++)
      {
          scanf("%d", p+i);
      }
    
      sum = 0;
      for(i = 0; i<n; i++)
      {
          sum = sum + *(p + i);
      }
    
      printf("aver = %d
    ", sum/n);
      free(p);
    
    }
    

    2、二维动态数组的实现

    dynamicArrayTwoDimensional.c

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int findMax(int *p, int m, int n, int *pRow, int *pCol);
    
    int main()
    {
      int *pScore = NULL, i, j, m, n, maxSocre, row, col;
    
      printf("Please enter array size m,n:");
      scanf("%d, %d", &m, &n);
    
      pScore = (int *) calloc(m*n, sizeof(int));
      if(pScore == NULL)
      {
          printf("No enough memory!
    ");
          exit(0);
      }
    
      printf("Please enter the score:
    ");
      for (i = 0; i < m; i++)
      {
          for (j = 0; j < n; j++)
          {
              scanf("%d", &pScore[i*n+j]);
          }
      }
    
      maxSocre = findMax(pScore, m, n, &row, &col);
    
      printf("maxSocre = %d, class = %d, number = %d
    ", maxSocre, row+1, col+1);
    
      free(pScore);
    
      return 0;
    }
    
    int findMax(int *p, int m, int n, int *pRow, int *pCol)
    {
      int i, j, max;
    
      max = p[0];
      *pRow = 0;
      *pCol = 0;
      for (i = 0; i < m; i++)
      {
          for (j = 0; j < n; j++)
          {
              if (p[i*n+j] > max)
              {
                  max = p[i*n+j];
                  *pRow = i;
                  *pCol = j;
              }
          }
      }
    
      return (max);
    }

    原文地址:http://yingbing.github.io/blog/2015/01/31/dynamic-array/

    代码地址:https://github.com/yingbing/C

  • 相关阅读:
    linux系统禁止root用户通过ssh登录及ssh的访问控制
    POJ 3670 , 3671 LIS
    hello world是怎样运行的?
    MFC框架中消失的WinMain()
    [置顶] android LBS的研究与分享(附PPT)
    POJ 3616 DP
    IMP 导入数据报错 OCI-21500 OCI-22275
    误删/tmp导致hadoop无法启停, jsp无法查看的解决方法
    java的文件操作类File
    C#的可空类型与不可空类型
  • 原文地址:https://www.cnblogs.com/yingbing/p/4265020.html
Copyright © 2011-2022 走看看