[求助]这段程序为什么会有段错误

软件和网站开发以及相关技术探讨
回复
dvdface
帖子: 152
注册时间: 2006-08-16 22:19
来自: 湖北武汉
联系:

[求助]这段程序为什么会有段错误

#1

帖子 dvdface » 2006-08-22 21:19

我是个菜鸟,帮忙看看吧。
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 }
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#2

帖子 BigSnake.NET » 2006-08-22 22:31

运行没问题啊。。
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
dvdface
帖子: 152
注册时间: 2006-08-16 22:19
来自: 湖北武汉
联系:

#3

帖子 dvdface » 2006-08-23 1:37

提示“段错误”啊!
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#4

帖子 BigSnake.NET » 2006-08-24 11:50

er......我编译运行都没有出错波。。。
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
winson
帖子: 48
注册时间: 2006-07-11 14:43

#5

帖子 winson » 2006-08-24 15:33

可能是node *p = new node失败
没有申请到空间
接下来p->i 指向未知,会提示段错误
line 13后加上 if(p==NULL) 判断下
p.s. 最后最好释放申请的内存空间delete p
头像
ectotherm
帖子: 225
注册时间: 2006-05-23 13:35
联系:

#6

帖子 ectotherm » 2006-08-25 15:51

delete 是不用判断的,社区公理应该知道,任何释放都是无条件且不会出错的。即使是 p = 0; delete p; 也没问题。

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

ps: 标准 C++ 规定一般的 new 失败会抛出异常,你要使用 try ... catch 来检查是什么出的问题。
janusle
帖子: 36
注册时间: 2006-08-14 11:40

#7

帖子 janusle » 2006-08-26 0:08

同意楼上的,建议LZ用gdb单步调试一下。
头像
SuperWar3Fan
帖子: 1263
注册时间: 2006-05-20 6:25
来自: 山东淄博
联系:

#8

帖子 SuperWar3Fan » 2006-08-26 10:45

next的值无法确定,所以出现错误.
另外L根本没有分配一个Node空间.
可以l=(node*)malloc(sizeof(struct node))
使L有确定的空间大小.
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#9

帖子 BigSnake.NET » 2006-08-26 14:18

楼上做法
在L = p;时就会内存泄漏
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
5451vs5451
帖子: 345
注册时间: 2006-07-14 18:56
来自: Apple Valley, Planet Tux, Linux System

#10

帖子 5451vs5451 » 2006-08-28 9:25

同意5楼的说法。
baobaobenben
帖子: 3
注册时间: 2006-08-25 10:10

aaa

#11

帖子 baobaobenben » 2006-09-14 17:16

node *p = new node;
问题就在这里
指针被分配地址后,值不明确。
dvdface
帖子: 152
注册时间: 2006-08-16 22:19
来自: 湖北武汉
联系:

#12

帖子 dvdface » 2006-09-15 9:18

winson 写了:可能是node *p = new node失败
没有申请到空间
接下来p->i 指向未知,会提示段错误
line 13后加上 if(p==NULL) 判断下
p.s. 最后最好释放申请的内存空间delete p
这个说法很好
按照教科书上面是 delete p之后,就是释放p所申请的空间,然后用p=NULL让它指向零地址。以免造成野指针的情况。

这段程序在 VS 2005里面编译没有问题。
也就是说,问题应该就是申请分配内存空间上面。
头像
ectotherm
帖子: 225
注册时间: 2006-05-23 13:35
联系:

#13

帖子 ectotherm » 2006-09-15 9:22

没话了,如果 new 失败会 throw std::bad_alloc,试问,throw 了下面的代码还能执行吗?还有 delete 之前要先判断是不是 NULL?请问你用的是什么编译器。
头像
ectotherm
帖子: 225
注册时间: 2006-05-23 13:35
联系:

#14

帖子 ectotherm » 2006-09-15 9:34

代码: 全选

#include <iostream>

int main(int, char**) {
	int* p = 0;
	delete p;
	std::cout << "run to this line" << "\n";
	return 0;
}
在 MinGW 上正常工作,ps 我没有听说过释放要判断 NULL 的,谢谢。
回复