查漏补缺_3-25
realloc()函数的错误使用记录
时间:3-25
- 此篇文章为记录个人学习中遇到的一些问题或知识漏洞,借此来进行梳理,查漏补缺
- **起因:**在编写一个函数题目时而发现,函数需要把从main函数中传过来的数组进行扩容(传的是数组名,如arr[3]={0,1,2,}在此数组基础上进行扩容arr[4]={0,1,2,3}),而在函数中我又习惯把数组名当成指针一样,去进行元素的查找和赋值操作,从而导致了程序的崩溃。
- 问题的关键是,我错以为在调用realloc函数时,数组名可以当成指针一般进行动态内存分配。
//pr = (int*)malloc(n * sizeof(int));
pr = (int*)realloc(arr, n * sizeof(int));
- 但代码在编译时并不会报错,而是在运行时程序直接挂了
如图 - 于是我通过调试一步一步执行,最终发现程序在走到realloc函数时出现上图报错,至此,我就猜想可能是进行动态内存分配时出现了错误,于是用了malloc函数再次进行内存申请
pr = (int*)malloc(n * sizeof(int));
//pr = (int*)realloc(arr, n * sizeof(int));
这次程序没有再报错(虽然成功开辟内存进行了“扩容”,但其中并没有保存原数组的元素,达不到预想的结果)
- 之后通过MSDN查看realloc函数
void *realloc( void *memblock, size_t size );
仔细阅读memblock说明后,发现“指向先前分配的内存块的指针”,也就是说realloc函数改变的是先前已经分配了的内存块大小,memblock指向的是这块已分配的空间的起始位置的地址,而数组名显然不符合函数使用规则。 - 看到这里,你可能已近发现了另一个错误——数组大小一旦确定就不能改变,我也是在书写这篇博客梳理思路时发现的,可真好,又查漏补缺了。
我竟然犯了这个本不该犯的错误,忽略了最基本的原则。
数组长度必须在编译时确定,如arr[10]这样,是不可以改变的,此时变量储存在栈区;但可以用malloc等函数在程序运行时动态分配所需"数组"长度,此时"数组“储存于堆区,可以改变"数组”的大小。 - 以上仅为个人见解,如有错误或描述不当,欢迎指正。