大家帮帮忙阿这个运行时报错Segmentation fault好像是什么段错误

C、C++和Java语言
回复
头像
mmxcq
帖子: 214
注册时间: 2007-07-28 14:04
送出感谢: 0
接收感谢: 0
联系:

大家帮帮忙阿这个运行时报错Segmentation fault好像是什么段错误

#1

帖子 mmxcq » 2007-11-14 17:17

#include <stdio.h>
#include <malloc.h>
int main(){
struct q
{int data;
struct q * next;
};
int length;
printf( "请输入链表的数据元素个数: ");
scanf( "%d ",&length);
struct q *p[length];
int i=0;
for( i=0;i <length;i++)
{p=(struct q *)malloc(sizeof(struct q));
if(i==length-1)p-> next=0;
else if(i!=0)p[i-1]-> next=p;
printf( "请输入第%d个元素 ",i);
scanf( "%d ",&p-> data);

//if(i==length-1)p-> next=0;
}
struct q *c;
printf( "请分别输入要在链表中X位置后插入(从0开始)的X的值和元素的值: ");
int x,y;
scanf( "%d,%d ",&x,&y);
c=(struct q *)malloc(sizeof(struct q));
c-> next=p[x+1];
p[x]-> next=c;
c-> data=y;
int j;
for(j=0;j <=length;j++)
{if(j==x)printf( "%d ",c-> data);
else printf( "%d ",p-> data);}
return 0;}





而且我在UBUNTU下没有错误但是我在WINDOWS下就有3个错误
真的不太清楚是什么原因
vupiggy
帖子: 89
注册时间: 2006-03-19 18:25
来自: FZ->TJ->PEK->AMS->MTL
送出感谢: 0
接收感谢: 0

#2

帖子 vupiggy » 2007-11-14 22:23

我猜想你是用VC编译的,而且编译出错可能在几个地方,这都是新gcc支持但是老编译器不支持的,一个是非出现在函数开始处的变量声明,另外一个是变量名被用来声明数组,还有... ??? 我没怎么仔细看。
上次由 vupiggy 在 2007-11-15 5:44,总共编辑 1 次。
头像
mmxcq
帖子: 214
注册时间: 2007-07-28 14:04
送出感谢: 0
接收感谢: 0
联系:

#3

帖子 mmxcq » 2007-11-14 22:36

我在这里来给它初始直啊scanf( "%d ",&length);
难道这个有错误
呵呵你能不能帮帮忙说清楚点GCC新支持的是哪几个啊
谢了
头像
mmxcq
帖子: 214
注册时间: 2007-07-28 14:04
送出感谢: 0
接收感谢: 0
联系:

#4

帖子 mmxcq » 2007-11-14 22:40

对了请问那个数组如果不用变量名
那用什么来声明啊因为我的数组长度是未知的啊
vupiggy
帖子: 89
注册时间: 2006-03-19 18:25
来自: FZ->TJ->PEK->AMS->MTL
送出感谢: 0
接收感谢: 0

#5

帖子 vupiggy » 2007-11-14 23:29

个人而言,十分反对gcc支持这种变量声明可以到处放的语法。即使gcc支持,最好不要这样做。c99写没写不知道,就算写了,偶也不会这么干。

用了变量作为长度声明的数组在栈里头内存分配具体gcc怎么搞,也不是我一下子能够想明白的,学艺不精啊:(

至于不用变量作为数组长度声明的替代方法嘛,倒是很简单:struct **q = malloc (sizeof (*q) * length); 让q指针指到堆里去,这样就可以大到系统支持的最大值,用数组结果是在栈里分配空间,其大小有限制,那个值记不得了,是个很小的值。实在喜欢放在栈里,就用alloca好了,别太大。

今天查了一下,c99明确允许用变量作为数组的长度,所以只要变量的值被初始化过,可以放心大胆地用。不过VC6是不支持地,升级你的盗版VC吧(猜你用的是盗版;)),呵呵。
上次由 vupiggy 在 2007-11-15 5:48,总共编辑 4 次。
vupiggy
帖子: 89
注册时间: 2006-03-19 18:25
来自: FZ->TJ->PEK->AMS->MTL
送出感谢: 0
接收感谢: 0

#6

帖子 vupiggy » 2007-11-14 23:34

对不起,一开始说的有误,程序不是死在不定长数组声明那里。
上次由 vupiggy 在 2007-11-15 5:49,总共编辑 2 次。
vupiggy
帖子: 89
注册时间: 2006-03-19 18:25
来自: FZ->TJ->PEK->AMS->MTL
送出感谢: 0
接收感谢: 0

#7

帖子 vupiggy » 2007-11-15 0:26

说老实话,这代码totally messy:( 我又编译一次,没有seg fault了,但是结果也不知所以,得,就不去猜你要做什么了,说个明显的错误

最后打印的地方不对:
for(j=0;j <=length;j++)
{if(j==x)printf( "%d ",c-> data);
else printf( "%d ",p[i]-> data);}
为什么这里是i?在这里i的值已经达到了length,你用p已经越界了。

好吧,就算是笔误,你想用p[j],那还是费解。
你这里想打印什么?插入新节点后的整个链表么?还是插入的节点之后的所有节点?如果是前者,你用if (j == x)
printf( "%d ",c-> data);
等于少打了一个,因为你新加入的节点并不再指针数组里,你这里打的新插入节点的值,那么它前面的节点,也就是p[x]被漏掉了。改成这样可能差不多:
for(j=0;j < length;j++){
printf( "%d ",p[j]-> data);
if(j==x)
printf( "%d ",c-> data);
}


你的总体意图不就是要建一个链表,然后在一个指定的位置插入一个节点?你用指针数组这个思路背离你的意图了,常规的方法是用一个计数器,计数你当前从头到到当前节点经历了多少个节点,如果已到达指定数字,在当前节点处插入,完事。用指针数组在第一次插入的时候貌似很高效,因为用数组的随机访问能力,不需要遍历,但是下一次插入呢?你在第一次插入的节点的地址不在你的指针数组里,怎么办?

建议下一次再问代码为什么不工作之前,先描述一下自己代码的意图,最后要实现什么,让旁人去猜,hmm,不是什么好主意。另外一个建议,照着C教科书上处理链表的例子写几个增强理解。

再有一个想法,你这个很很很像java,在C里保持这个习惯真的满怪的,当然这么处理有好处,就是当出现异常的时候,不过刚开始写C,还是一切照教科书的传统来吧。
dbzhang800
帖子: 3182
注册时间: 2006-03-10 15:10
来自: xi'an China
送出感谢: 0
接收感谢: 2 次
联系:

#8

帖子 dbzhang800 » 2007-11-15 10:33

除非你用的C99,不然不管是gcc还是vc的警告/错误都应该引起你的注意
头像
mmxcq
帖子: 214
注册时间: 2007-07-28 14:04
送出感谢: 0
接收感谢: 0
联系:

#9

帖子 mmxcq » 2007-11-15 11:39

真的是非常感谢我是学的JAVA但是最近学校要考试了
我们考C语言版的数据结构所以在用JAVA的习惯来写真的很感谢你
我再去看看呵呵
头像
mmxcq
帖子: 214
注册时间: 2007-07-28 14:04
送出感谢: 0
接收感谢: 0
联系:

#10

帖子 mmxcq » 2007-11-15 11:49

#include<stdio.h>
#include<malloc.h>
int main(){
struct q
{int data;
struct q * next;
};
int length,i=0, x,y, j;
printf("请输入链表的数据元素个数:");
scanf("%d",&length);
struct q *p[length];

for( i=0;i<length;i++)
{p=(struct q *)malloc(sizeof(struct q));
if(i==length-1)p->next=0;
else if(i!=0)p[i-1]->next=p;
printf("请输入第%d个元素:",i);
scanf("%d",&p->data);
}
struct q *c;
printf("请分别输入要在链表中X位置后插入(从0开始)的X的值和元素的值:");

scanf("%d,%d",&x,&y);
c=(struct q *)malloc(sizeof(struct q));
c->next=p[x+1];
p[x]->next=c;
c->data=y;

for(j=0;j<length;j++)
{ printf("%d",p[j]->data);
if(j==x)printf("%d",c->data);
}
return 0;}


非常感谢你我这个做出来了结果也出来了
但是VC不能允许变量作为数组长度那我要在WINDOWS下交作业阿
你知道怎么改吗呵呵能把你的QQ说说吗
认识认识以后多多请教说一下我在自学JAVA呵呵
vupiggy
帖子: 89
注册时间: 2006-03-19 18:25
来自: FZ->TJ->PEK->AMS->MTL
送出感谢: 0
接收感谢: 0

#11

帖子 vupiggy » 2007-11-15 22:01

把这行:
struct q *p[length];
改成:
struct q **p = malloc (length * sizeof (*p));
头像
mmxcq
帖子: 214
注册时间: 2007-07-28 14:04
送出感谢: 0
接收感谢: 0
联系:

#12

帖子 mmxcq » 2007-11-16 11:14

呵呵谢了看来我的C还是很差阿
呵呵
非常感谢
回复

回到 “C/C++/Java”