C程序为啥会崩溃?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C程序为啥会崩溃?相关的知识,希望对你有一定的参考价值。
参考技术AC语言程序运行出现exe停止工作的原因是因为内存溢出和编译器错误。
第一种:内存溢出
内存溢出(out of memory)通俗理解就是内存不够,程序所需要的内存远远超出了主机内安装的内存所承受大小,就叫内存溢出。系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件。
第二种:编译器错误
部分编译器由于所使用的标准不同(例如在一台机器上使用的可能是C99标准,而另一台机器上使用的是C11标准),或是因为编译器链接库的损坏,在少数情况下也可能导致程序出现不限于崩溃退出的异常错误,通常解决方法是到编译器官方网站下载最新版的IDE安装。
举例说明:
1、除以零。
2、数组越界:int a[3]; a[10000000]=10。
3、指针越界:int * p; p=(int *)malloc(5 * sizeof(int)); *(p+1000000)=10。
4、使用已经释放的空间:int * p; p=(int *)malloc(5 * sizeof(int));free(p); *p=10。
5、数组开得太大,超出了栈的范围,造成栈溢出:int a[100000000],没有开辟内存 List L=(List)malloc(sizeof(struct LNode))。runtime error (运行时错误)就是程序运行到一半,程序就崩溃了。
扩展资料:
C特有特点:
1、C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。
2、C语言传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer passed by value)。
3、不同的变量类型可以用结构体(struct)组合在一起。
4、只有32个保留字(reserved keywords),使变量、函数命名有更多弹性。
5、部份的变量类型可以转换,例如整型和字符型变量。
6、通过指针(pointer),C语言可以容易的对存储器进行低级控制。
7、预编译处理(preprocessor)让C语言的编译更具有弹性。
参考资料:C语言-百度百科
当我尝试从单链表中删除节点时,为啥我的 C 程序会崩溃
【中文标题】当我尝试从单链表中删除节点时,为啥我的 C 程序会崩溃【英文标题】:Why does my C Program crash when I try to delete a node out of a singe linked list当我尝试从单链表中删除节点时,为什么我的 C 程序会崩溃 【发布时间】:2022-01-15 12:59:54 【问题描述】:我目前正在用 C 语言创建一个程序,它基本上是一个链表内的链表。内部列表是字符,外部列表是单词。不幸的是,我在删除一些外部节点(单词)和释放它们的内存时遇到了问题。我的程序不断崩溃,我不知道为什么。编译器没有给我任何警告或错误,我一直在寻找修复几个小时。任何可以查看代码的人都可以得到任何帮助!谢谢!
*void deleteWord (Node* Node, int index)
int counter = 0;
if (Node == NULL)
return;
while (Node->next != NULL && counter != (index - 1))
Node = Node->next;
counter++;
struct node* wordTemp = Node->next;
//Node->next = Node->next->next;
while (wordTemp->word != NULL)
InnerNode* letterTemp = wordTemp->word->next;
free(wordTemp->word);
wordTemp->word = letterTemp;
free(wordTemp);
return;
【问题讨论】:
为什么是counter != (index - 1)
? counter
从零开始,index
从 1 开始?
这样我就得到了我真正想要释放的节点之前的节点,所以我可以将它与我想要释放的节点之后的节点链接
嗯好的。但是,如果您传入索引 0,您将获得列表中的最后一个节点,这可能不是您想要的。你也需要处理极端情况。
【参考方案1】:
似乎您正在释放 Node->next(存储在 wordTemp 中),而没有重新分配它,实际上破坏了链表中的链接,所以现在 Node->next 指向已删除的内存。
【讨论】:
我正在将当前节点与我要删除的节点之后的节点链接。 node->next 变成 node->next->next,所以本质上是把前一个节点和下一个节点连接起来,并复制一个我想免费的节点,称之为 wordTemp以上是关于C程序为啥会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试重新分配()结构指针数组时,为啥我的 C 程序会崩溃?