关于数组章节,使用C语言realloc实现动态数组的报错,请老师解惑

来源:2-9 均摊复杂度和防止复杂度的震荡

行息衍

2018-07-13

想实现在输入时就进行扩容,最终结果显示正确,但是瞬间崩溃,只能觉的是指针出了问题,但是无法查出,还请老师解惑。

int* CreatArr(int tmpcapacity);             // 构造函数,传入数组的容量capacity构造Array
int SetArr(int *array,int num);               // 设置数组中的值
int ShowArr(int *array);              // 显示数组中的元素
int GetCapacity(int *array);          // 获取数组的容量

int ExpendCapacity (int *array,unsigned int newcapacity);   // 将数组空间的容量变成newCapacity大小

int capacity;
int esize;

int main()
{
    int *array;
    int num;    //初始化数组中元素个数
    int sts = 1;
    array = CreatArr(8);
    num = 10;
    SetArr(array,num);
    ShowArr(array);
    sts = GetCapacity(array);
    printf("sts = %d\n",sts);
    return 0;
}
int* CreatArr(int tmpcapacity)
{
    if(capacity < 0)
    {
        capacity = 10;
    }
    else  capacity = tmpcapacity;
    int *array = (int*)malloc(sizeof(int) * capacity) ;
    esize = 0;
    return array;
}
int SetArr(int *array,int num)
{
    int i;
    if(num < 0 )
    {
        printf("The num is err");
        return -1;
    }
    if (num >= capacity)    //感觉这里还能优化,但是不知道怎么做
    {
        while (num >= capacity)
        {
            capacity *= 2;
        }
        ExpendCapacity(array,(unsigned int)capacity);
    }
    for(i = 0 ;i < num ; i ++)
    {
        printf("array[%d] = ",i);
        scanf("%d",array++);
        esize++;
    }
    return 0;
}
int ShowArr(int *array)
{
    int i;
    for (i = 0; i < esize  ; i++)
    {
        printf("array[%d] = %d\n",i,array[i]);
    }
    printf("\n\n");
    return 0;
}
int GetCapacity (int *array)
{
    return capacity;
}
int ExpendCapacity (int *array,unsigned int newcapacity)
{
    realloc((void *)array,newcapacity);
}
写回答

1回答

liuyubobobo

2018-07-13

非常抱歉。我不可能做到每一个同学使用不同的语言或者方式实现课程代码,代码调不通的时候把代码贴到问答区,我就帮助进行debug,请谅解。


请自己尝试一点一点的进行debug。debug本身是所有程序员必备的基础技能,也是关键核心技能。无论是通过打印输出的方式,还是断点的方式,一点一点跟到你的程序里,先确定究竟是在哪一行出了问题,再仔细研究程序中变量的存储,看究竟是为什么出发了问题:)


加油!


------


P.S.1 我在我的环境下运行了一边你的程序,没有崩。


P.S.2 我是使用C++11编译器运行的。由于C++编译器版本众多,不同的编译器处理一些语言实现的细节不一样,所以同样的代码也可能由于触发编译器的一些“实现死角”,而导致不同的结果。比如在你的代码中,capacity和esize两个变量没有进行初始化。这样做在java中是安全的,在C/C++中是极不安全的。


P.S.3 个人不是特别建议使用C语言实现这个课程的代码。数据结构本身是非常容易进行面向对象设计的。而C语言原生不支持面向对象,使得所有的实现都要绕弯子。当然并非不可以,但如果你是计算机专业的初学者的话,这样做平添了很多难度:-(。如果一定使用C语言,建议使用struct:)


P.S.4 关于使用C语言进行OO的实践,在很久远的时候(其实也就20年的事儿,那会儿面向对象语言还没有那么发达,Java都还没有问世呢),已经有很深刻的讨论了。其中的一个著作,叫做《Object-Oriented Programming With ANSI-C》,全书可在网上免费阅读,传送门:http://www.planetpdf.com/codecuts/pdfs/ooc.pdf  。对C语言;操作系统;系统设计;驱动开发等底层开发感兴趣的话,可以先留着,以后等自己水平提高了,值得通读一遍。不过根据你的代码情况,现阶段,还是建议使用面向对象语言,尤其推荐使用Java语言,学习本课程,学习目标以学习数据结构为主,而不要过多的和语言特性作斗争。使用Java语言会避免很多写C系语言遇到的内存管理的问题:)当然,如果你不会Java语言,推荐使用C++;如果你不会C++,建议写学习一门面向对象的编程语言,再学习这个课程,会顺当很多。(推荐Java:))


加油!

0
3
liuyubobobo
回复
行息衍
继续加油!:)
2018-07-14
共3条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程