lijialijialijia 发表于 2020-3-11 19:12:22

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

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//创建一个线性表的数据类型 参数:【数组 , 元素个数 , 内存空间】
struct list{
    int *arr;
    int len_list;
    int com_list;
};

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

int main()
{
    struct list A;
    int ii , a1;

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

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


    show_list(&A);



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


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





    return 0;
}

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

    int ii=0;

    for( ii=0 ; ii<(st->len_list) ; ii++)
    {
      printf("%d " , st->arr);
    }

    printf("\n");
}

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

      int ii;

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

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

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

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

    st->arr = num;

    st->len_list++;

    return;

}

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

    *e = (st->arr)-1;

    return true;

}

boolempty_list( struct list *st )             //判断线性表是否为空
{
    if( (st->len_list) == 0 )returntrue;

    return false;
}

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

    free(st->arr);
}



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

    //首先为空表分配10个数据空间
    st->com_list = 10;
    st->len_list = 0;
    st->arr = (int*)malloc(( st->com_list)*sizeof(int));
    //赋值为0
    for(ii=0 ; ii<st->com_list ; ii++)      (st->arr) = 1;

}


在添加元素的时候 扩充数组长度就报错 请问有大神知道是为什么

ba21 发表于 2020-3-11 19:37:49

扩充内存,你搞个局部变量struct list tmp;   //申请一个临时结构体 扩充线性表空间 有何用? 出了函数就没了。

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

用relloc一句不就搞定了。

int main()
{
    struct list A;
    int ii , a1;

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

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


    show_list(&A);



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


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





    return 0;
}


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

    }

    st->arr = num;

    st->len_list++;

    return;

}
页: [1]
查看完整版本: 关于数据的动态申请内存的问题