当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 14 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [求助]这段程序为什么会有段错误
帖子发表于 : 2006-08-22 21:19 

注册: 2006-08-16 22:19
帖子: 152
地址: 湖北武汉
送出感谢: 0 次
接收感谢: 1
我是个菜鸟,帮忙看看吧。
g++编译可以通过
执行就提示段错误,奇怪。





1 #include <iostream>
2
3 int main()
4 {
5 typedef struct node{
6 int i;
7 node *next;
8 }*linklist;
9
10 linklist L;
11
12
13 node *p = new node;
14 p->i=10;
15 p->next=NULL;
16
17 L = p;
18
19 return 0;
20
21 }


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2006-08-22 22:31 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
运行没问题啊。。


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2006-08-23 1:37 

注册: 2006-08-16 22:19
帖子: 152
地址: 湖北武汉
送出感谢: 0 次
接收感谢: 1
提示“段错误”啊!


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2006-08-24 11:50 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
er......我编译运行都没有出错波。。。


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2006-08-24 15:33 

注册: 2006-07-11 14:43
帖子: 48
送出感谢: 0 次
接收感谢: 0 次
可能是node *p = new node失败
没有申请到空间
接下来p->i 指向未知,会提示段错误
line 13后加上 if(p==NULL) 判断下
p.s. 最后最好释放申请的内存空间delete p


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2006-08-25 15:51 
头像

注册: 2006-05-23 13:35
帖子: 225
送出感谢: 0 次
接收感谢: 0 次
delete 是不用判断的,社区公理应该知道,任何释放都是无条件且不会出错的。即使是 p = 0; delete p; 也没问题。

至于代码为什么会出错,我也不知道。

ps: 标准 C++ 规定一般的 new 失败会抛出异常,你要使用 try ... catch 来检查是什么出的问题。


_________________
我的 BLOG 欢迎来踩!


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2006-08-26 0:08 

注册: 2006-08-14 11:40
帖子: 36
送出感谢: 0 次
接收感谢: 0 次
同意楼上的,建议LZ用gdb单步调试一下。


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2006-08-26 10:45 
头像

注册: 2006-05-20 6:25
帖子: 1263
地址: 山东淄博
送出感谢: 0 次
接收感谢: 0 次
next的值无法确定,所以出现错误.
另外L根本没有分配一个Node空间.
可以l=(node*)malloc(sizeof(struct node))
使L有确定的空间大小.


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2006-08-26 14:18 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
楼上做法
在L = p;时就会内存泄漏


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2006-08-28 9:25 
头像

注册: 2006-07-14 18:56
帖子: 345
地址: Apple Valley, Planet Tux, Linux System
送出感谢: 0 次
接收感谢: 0 次
同意5楼的说法。


页首
 用户资料  
 
11 楼 
 文章标题 : aaa
帖子发表于 : 2006-09-14 17:16 

注册: 2006-08-25 10:10
帖子: 3
送出感谢: 0 次
接收感谢: 0 次
node *p = new node;
问题就在这里
指针被分配地址后,值不明确。


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2006-09-15 9:18 

注册: 2006-08-16 22:19
帖子: 152
地址: 湖北武汉
送出感谢: 0 次
接收感谢: 1
winson 写道:
可能是node *p = new node失败
没有申请到空间
接下来p->i 指向未知,会提示段错误
line 13后加上 if(p==NULL) 判断下
p.s. 最后最好释放申请的内存空间delete p


这个说法很好
按照教科书上面是 delete p之后,就是释放p所申请的空间,然后用p=NULL让它指向零地址。以免造成野指针的情况。

这段程序在 VS 2005里面编译没有问题。
也就是说,问题应该就是申请分配内存空间上面。


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2006-09-15 9:22 
头像

注册: 2006-05-23 13:35
帖子: 225
送出感谢: 0 次
接收感谢: 0 次
没话了,如果 new 失败会 throw std::bad_alloc,试问,throw 了下面的代码还能执行吗?还有 delete 之前要先判断是不是 NULL?请问你用的是什么编译器。


_________________
我的 BLOG 欢迎来踩!


页首
 用户资料  
 
14 楼 
 文章标题 :
帖子发表于 : 2006-09-15 9:34 
头像

注册: 2006-05-23 13:35
帖子: 225
送出感谢: 0 次
接收感谢: 0 次
代码:
#include <iostream>

int main(int, char**) {
   int* p = 0;
   delete p;
   std::cout << "run to this line" << "\n";
   return 0;
}


在 MinGW 上正常工作,ps 我没有听说过释放要判断 NULL 的,谢谢。


_________________
我的 BLOG 欢迎来踩!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 14 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:Yahoo [Bot] 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译