realloc错用记录

查漏补缺_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));
  • 但代码在编译时并不会报错,而是在运行时程序直接挂了
    如图VS2019
  • 于是我通过调试一步一步执行,最终发现程序在走到realloc函数时出现上图报错,至此,我就猜想可能是进行动态内存分配时出现了错误,于是用了malloc函数再次进行内存申请
      pr = (int*)malloc(n * sizeof(int));
	//pr = (int*)realloc(arr, n * sizeof(int));

这次程序没有再报错(虽然成功开辟内存进行了“扩容”,但其中并没有保存原数组的元素,达不到预想的结果)

  • 之后通过MSDN查看realloc函数
    void *realloc( void *memblock, size_t size );
    MSDN
    仔细阅读memblock说明后,发现“指向先前分配的内存块的指针”,也就是说realloc函数改变的是先前已经分配了的内存块大小,memblock指向的是这块已分配的空间的起始位置的地址,而数组名显然不符合函数使用规则。
  • 看到这里,你可能已近发现了另一个错误——数组大小一旦确定就不能改变,我也是在书写这篇博客梳理思路时发现的,可真好,又查漏补缺了。
    我竟然犯了这个本不该犯的错误,忽略了最基本的原则。
    数组长度必须在编译时确定,如arr[10]这样,是不可以改变的,此时变量储存在栈区;但可以用malloc等函数在程序运行时动态分配所需"数组"长度,此时"数组“储存于堆区,可以改变"数组”的大小。
  • 以上仅为个人见解,如有错误或描述不当,欢迎指正。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值