鱼C论坛

 找回密码
 立即注册
查看: 1754|回复: 1

关于数据的动态申请内存的问题

[复制链接]
发表于 2020-3-11 19:12:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. //  创建一个线性表的数据类型 参数:【数组 , 元素个数 , 内存空间】
  5. struct list{
  6.     int *arr;
  7.     int len_list;
  8.     int com_list;[b][b][/b][/b]
  9. };

  10. void init_list( struct list *st );              //  初始化一个空表: 分配内存
  11. void clear_list( struct list *st );             //  清空线性表
  12. bool empty_list( struct list *st );             //  判断线性表是否为空
  13. bool get_elem( struct list *st , int pos , int *e );      //  获取线性表某个位置的值
  14. void insert_list(struct list *st , int num );                       //  插入一个元素
  15. void show_list( struct list *st );                        //  打印线性表

  16. int main()
  17. {
  18.     struct list A;
  19.     int ii , a1;

  20.     init_list(&A);                 //  初始化线性表

  21.     for(ii=0 ; ii<15 ; ii++ )      //  为线性表赋值
  22.     {
  23.         insert_list(&A , ii);
  24.     }


  25.     show_list(&A);



  26.     clear_list(&A);     //  清空线性表


  27.     printf("leng=%d , comp=%d\n" , A.len_list , A.com_list);





  28.     return 0;
  29. }

  30. void show_list( struct list *st )                        //  打印线性表
  31. {
  32.     if( (st->len_list) == 0 )  { printf("空表\n");     return;  }

  33.     int ii=0;

  34.     for( ii=0 ; ii<(st->len_list) ; ii++)
  35.     {
  36.         printf("%d " , st->arr[ii]);
  37.     }

  38.     printf("\n");
  39. }

  40. void insert_list(struct list *st , int num )                       //  插入一个元素
  41. {
  42.     //  判断内存空间是否充足 添加空间
  43.     if( (st->len_list) == (st->com_list) )
  44.     {
  45.         struct list tmp;   //  申请一个临时结构体 扩充线性表空间

  46.         int ii;

  47.         tmp.len_list = 0;
  48.         tmp.com_list = (st->com_list)+10;
  49.         tmp.arr = (int*)malloc(  (st->com_list)*sizeof(int)  );

  50.         //  为临时结构体赋值
  51.         for(ii=0 ; ii<(st->com_list) ; ii++)
  52.         {
  53.             tmp.arr[ii] = (st->arr)[ii];    tmp.len_list++;
  54.         }

  55.         //  释放内存
  56.         free(st->arr);  st->com_list=st->len_list=0;                                       我这里释放旧的内存空间

  57.         st->arr = tmp.arr;  st->com_list = tmp.com_list;  st->len_list=tmp.len_list;     给指针重新指定一个新的空间的用法是不是不对  
  58.     }

  59.     st->arr[st->len_list] = num;

  60.     st->len_list++;

  61.     return;

  62. }

  63. bool get_elem( struct list *st , int pos , int *e )      //  获取线性表某个位置的值
  64. {
  65.     //  查找的值不在范围内
  66.     if( pos<=0 || pos>(st->len_list) )  {  return false;  }

  67.     *e = (st->arr)[pos]-1;

  68.     return true;

  69. }

  70. bool  empty_list( struct list *st )             //  判断线性表是否为空
  71. {
  72.     if( (st->len_list) == 0 )  return  true;

  73.     return false;
  74. }

  75. void clear_list( struct list *st )             //  清空线性表
  76. {
  77.     st->len_list = 0;
  78.     st->com_list = 0;

  79.     free(st->arr);
  80. }



  81. void init_list( struct list *st )              //  初始化一个空表
  82. {
  83.     int ii=0;

  84.     //  首先为空表分配10个数据空间
  85.     st->com_list = 10;
  86.     st->len_list = 0;
  87.     st->arr = (int*)malloc(( st->com_list)*sizeof(int));
  88.     //  赋值为0
  89.     for(ii=0 ; ii<st->com_list ; ii++)      (st->arr)[ii] = 1;

  90. }
复制代码


在添加元素的时候 扩充数组长度就报错 请问有大神知道是为什么
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-11 19:37:49 | 显示全部楼层
扩充内存,你搞个局部变量struct list tmp;   //  申请一个临时结构体 扩充线性表空间 有何用? 出了函数就没了。

扩充内存用malloc又还要想办法复制之前的数据。

用relloc一句不就搞定了。

  1. int main()
  2. {
  3.     struct list A;
  4.     int ii , a1;

  5.     init_list(&A);                 //  初始化线性表

  6.     for(ii=0 ; ii<15 ; ii++ )      //  为线性表赋值
  7.     {
  8.         insert_list(&A , ii);
  9.     }


  10.     show_list(&A);



  11.    // clear_list(&A);     //  清空线性表


  12.     printf("leng=%d , comp=%d\n" , A.len_list , A.com_list);





  13.     return 0;
  14. }
复制代码

  1. void insert_list(struct list *st , int num )                       //  插入一个元素
  2. {
  3.     //  判断内存空间是否充足 添加空间
  4.     if( (st->len_list) == (st->com_list) )
  5.     {
  6.                 realloc(st->arr, st->com_list + (sizeof(int) * 10)); // 扩充10

  7.     }

  8.     st->arr[st->len_list] = num;

  9.     st->len_list++;

  10.     return;

  11. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 09:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表