关于数组章节,使用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回答
-
非常抱歉。我不可能做到每一个同学使用不同的语言或者方式实现课程代码,代码调不通的时候把代码贴到问答区,我就帮助进行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:))
加油!
032018-07-14
相似问题