当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 12 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 大家帮帮忙阿这个运行时报错Segmentation fault好像是什么段错误
帖子发表于 : 2007-11-14 17:17 
头像

注册: 2007-07-28 14:04
帖子: 214
送出感谢: 0 次
接收感谢: 0 次
#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[i]=(struct q *)malloc(sizeof(struct q));
if(i==length-1)p[i]-> next=0;
else if(i!=0)p[i-1]-> next=p[i];
printf( "请输入第%d个元素 ",i);
scanf( "%d ",&p[i]-> data);

//if(i==length-1)p[i]-> 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[i]-> data);}
return 0;}





而且我在UBUNTU下没有错误但是我在WINDOWS下就有3个错误
真的不太清楚是什么原因


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-11-14 22:23 

注册: 2006-03-19 18:25
帖子: 89
地址: FZ->TJ->PEK->AMS->MTL
送出感谢: 0 次
接收感谢: 0 次
我猜想你是用VC编译的,而且编译出错可能在几个地方,这都是新gcc支持但是老编译器不支持的,一个是非出现在函数开始处的变量声明,另外一个是变量名被用来声明数组,还有... ??? 我没怎么仔细看。


最后由 vupiggy 编辑于 2007-11-15 5:44,总共编辑了 1 次

页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-11-14 22:36 
头像

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


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-11-14 22:40 
头像

注册: 2007-07-28 14:04
帖子: 214
送出感谢: 0 次
接收感谢: 0 次
对了请问那个数组如果不用变量名
那用什么来声明啊因为我的数组长度是未知的啊


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-11-14 23:29 

注册: 2006-03-19 18:25
帖子: 89
地址: FZ->TJ->PEK->AMS->MTL
送出感谢: 0 次
接收感谢: 0 次
个人而言,十分反对gcc支持这种变量声明可以到处放的语法。即使gcc支持,最好不要这样做。c99写没写不知道,就算写了,偶也不会这么干。

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

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

今天查了一下,c99明确允许用变量作为数组的长度,所以只要变量的值被初始化过,可以放心大胆地用。不过VC6是不支持地,升级你的盗版VC吧(猜你用的是盗版;)),呵呵。


最后由 vupiggy 编辑于 2007-11-15 5:48,总共编辑了 4 次

页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-11-14 23:34 

注册: 2006-03-19 18:25
帖子: 89
地址: FZ->TJ->PEK->AMS->MTL
送出感谢: 0 次
接收感谢: 0 次
对不起,一开始说的有误,程序不是死在不定长数组声明那里。


最后由 vupiggy 编辑于 2007-11-15 5:49,总共编辑了 2 次

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

注册: 2006-03-19 18:25
帖子: 89
地址: FZ->TJ->PEK->AMS->MTL
送出感谢: 0 次
接收感谢: 0 次
说老实话,这代码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[i]已经越界了。

好吧,就算是笔误,你想用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,还是一切照教科书的传统来吧。


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-11-15 10:33 

注册: 2006-03-10 15:10
帖子: 3182
地址: xi'an China
送出感谢: 0 次
接收感谢: 2
除非你用的C99,不然不管是gcc还是vc的警告/错误都应该引起你的注意


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2007-11-15 11:39 
头像

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


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2007-11-15 11:49 
头像

注册: 2007-07-28 14:04
帖子: 214
送出感谢: 0 次
接收感谢: 0 次
#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[i]=(struct q *)malloc(sizeof(struct q));
if(i==length-1)p[i]->next=0;
else if(i!=0)p[i-1]->next=p[i];
printf("请输入第%d个元素:",i);
scanf("%d",&p[i]->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呵呵


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2007-11-15 22:01 

注册: 2006-03-19 18:25
帖子: 89
地址: FZ->TJ->PEK->AMS->MTL
送出感谢: 0 次
接收感谢: 0 次
把这行:
struct q *p[length];
改成:
struct q **p = malloc (length * sizeof (*p));


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2007-11-16 11:14 
头像

注册: 2007-07-28 14:04
帖子: 214
送出感谢: 0 次
接收感谢: 0 次
呵呵谢了看来我的C还是很差阿
呵呵
非常感谢


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

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


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

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

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