C语言,请问为什么扩展分配内存后,再释放指针程序就无法退出了?

jdjdmn 2015-09-13 05:45:34
如果没有执行扩展分配内存,程序会正常退出,但是如果执行了的话,执行到释放指针的语句,程序就动不了了,请问这是为什么呢?
...全文
189 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2015-09-15
  • 打赏
  • 举报
回复
引用 7 楼 u014626834 的回复:
可是我输入了11个数据,还是正常显示了呢?
1)C内存分配策略,是分配足够的内存,而不是恰到好处的内存。 2)内存越界的结果,可能是破坏为管理内存,而设定的数据结构,未必一定会抛出异常。 3)编译期间,和程序运行期间不报错,不代表程序没有错误。
赵4老师 2015-09-14
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
www_adintr_com 2015-09-13
  • 打赏
  • 举报
回复
内存访问越界的后果是行为未定义的,程序可能产生这种异常,也可能产生那种异常,也可能没有异常
jdjdmn 2015-09-13
  • 打赏
  • 举报
回复
可是我输入了11个数据,还是正常显示了呢?
www_adintr_com 2015-09-13
  • 打赏
  • 举报
回复
realloc 的参数不是增加多少内存,而是增加到多少 你永远只分配 10 个 int,当数据超过 10 个就出现内存访问越界了
jdjdmn 2015-09-13
  • 打赏
  • 举报
回复
请帮我看看,谢谢!
jdjdmn 2015-09-13
  • 打赏
  • 举报
回复
#include <stdio.h> #include <malloc.h> int main(void) { int *p = (int*)calloc(10, sizeof(int)); if (!p) { printf("内存分配错误!\n"); return 0; } int *ptemp = { NULL }; int i = 0; int j = 0; printf("请输入:\n"); for (i = 0;;) { scanf_s("%d", (p + i)); getchar(); ++j; if (i % 9 == 0) { ptemp = (int*)realloc(p, 10 * sizeof(int)); if (!ptemp) { printf("上限内存分配错误!\n"); free(p); p = NULL; return 0; } p = ptemp; } if (*(p + i) == 9999) { break; } ++i; } printf("\n\n下面进行输出:\n\n"); for (i = 0; i < j; ++i) { printf("%d ", *(p + i)); } free(p); p = NULL; return 0; }
宋寒松 2015-09-13
  • 打赏
  • 举报
回复
说明内存分配和指针应用上出问题了。
漠北老将 2015-09-13
  • 打赏
  • 举报
回复
show me the code
www_adintr_com 2015-09-13
  • 打赏
  • 举报
回复
因为程序中有 BUG

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧