| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1958 人关注过本帖
标题:访问违例(段异常)
取消只看楼主 加入收藏
youngpennyu
Rank: 2
等 级:论坛游民
帖 子:37
专家分:19
注 册:2011-6-13
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:13 
访问违例(段异常)
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 1
int main()
{  FILE *fp;
  char str[N],name[N],s[N],year[N],wname[N],wyear[N],m[N];
  if((fp=fopen("string.txt","w"))==NULL)
{ printf("Can't open file!\n");
    exit(1);}
for(int i=0;i<N;i++)
{ printf("\n输入职工信息:\n");
  printf("职工编号:");
  gets(str);
  fputs(str,fp);   //运行到此处出现异常
  printf("输入姓名:");
  gets(name);
  fputs(name,fp);
  printf("输入性别:");
  gets(s);
  fputs(s,fp);
  printf("出生年份:");
  gets(year);
  fputs(year,fp);
  printf("职称:");
  gets(wname);
  fputs(wname,fp);
  printf("任现职年限:");
  gets(wyear);
  fputs(wyear,fp);
  printf("实发工资:");
  gets(m);
  fputs(m,fp);}
  fclose(fp);
}

#define N 1   改成#define N 2 后可以正常运行
注释掉第一部分的gets(str)后面同样可以正常运行
如果说是str[N]空间不足造成异常,为什么后面的数组没有问题?
如果不是空间不足那是什么原因?求解.....
搜索更多相关主题的帖子: color 
2011-06-22 19:30
youngpennyu
Rank: 2
等 级:论坛游民
帖 子:37
专家分:19
注 册:2011-6-13
收藏
得分:0 
我也觉得不可以因为不有个\0  但是后面的数组却没有问题又是为什么呢?
2011-06-22 19:33
youngpennyu
Rank: 2
等 级:论坛游民
帖 子:37
专家分:19
注 册:2011-6-13
收藏
得分:0 
以下是引用voidx在2011-6-22 20:37:08的发言:

后面一样有问题,但是不会被执行,因为已经发生异常了。
 
不过我却不知道为什么这里会出现段异常。期待高手解答
/*printf("\n输入职工信息:\n");
  printf("职工编号:");
  gets(str);
  fputs(str,fp);  */
这一段我注释掉然后编绎执行 在string.txt会得到输入的结果
与你所说的不会执行不相符
2011-06-22 20:49
youngpennyu
Rank: 2
等 级:论坛游民
帖 子:37
专家分:19
注 册:2011-6-13
收藏
得分:0 
以下是引用voidx在2011-6-22 20:46:33的发言:

啊~我了解了。
如果楼主把字符数组的长度定义为 1 或在读取字符串的时候,输入字符串的长度超过了数组长度,那么,文件指针 fp 的值就有可能被覆盖。
而在执行 fputs() 的时候会向 fp 指向的内存区域中写入数据。由于之前读取字符串的时候改变了 fp 的值,即 fp 所指向的内存单元地址,因此,有可能引发段异常
段异常应该是这个原因,但是只发生在str[N]这个数组,个人认为理论上后面的数组应该发生同样的错,实际上却没发生
2011-06-22 20:51
youngpennyu
Rank: 2
等 级:论坛游民
帖 子:37
专家分:19
注 册:2011-6-13
收藏
得分:0 
回复 8楼 voidx
异常~~
2011-06-22 20:58
youngpennyu
Rank: 2
等 级:论坛游民
帖 子:37
专家分:19
注 册:2011-6-13
收藏
得分:0 
回复 8楼 voidx
超过2个字符必然异常的啊~本来\0占一个字符了,理应1个字符就该异常的
2011-06-22 21:00
youngpennyu
Rank: 2
等 级:论坛游民
帖 子:37
专家分:19
注 册:2011-6-13
收藏
得分:0 
以下是引用voidx在2011-6-22 20:55:21的发言:

你可以只要最后的 gets(m) 之后的代码,然后输入一个很长的字符串试试,看看段异常不
 
6 楼所述情况是因为你恰好没有覆盖 fp 的值。
我是故意注释掉str写入fp的部分,因为只有它才发生异常
其它数组同样会向fp写数据,并且同样是超过1个字符(2个字符),没有发生异常
我不懂的地方是同样大小的数组写入fp只有str发生异常

[ 本帖最后由 youngpennyu 于 2011-6-22 21:09 编辑 ]
2011-06-22 21:07
youngpennyu
Rank: 2
等 级:论坛游民
帖 子:37
专家分:19
注 册:2011-6-13
收藏
得分:0 
回复 11楼 voidx
异常的,而且我认为也必定是异常的,输入2个字符时就异常了,但不应该即使是1个字符也异常吗?
2011-06-22 21:08
youngpennyu
Rank: 2
等 级:论坛游民
帖 子:37
专家分:19
注 册:2011-6-13
收藏
得分:0 
回复 14楼 cosdos
看来把重点偏了~~~的确是因为数组长度的问题造成的,
但是我发的代码里所有数组长度都为1,按理说每个gets()都会长度不足报错,但是只有str[]报错

把数组长度变大可以解决这个问题,我是知道的,在贴子里我已写明~~~

[ 本帖最后由 youngpennyu 于 2011-6-22 21:15 编辑 ]
2011-06-22 21:13
youngpennyu
Rank: 2
等 级:论坛游民
帖 子:37
专家分:19
注 册:2011-6-13
收藏
得分:0 
回复 17楼 voidx
求解~~~哦~~明白了~~看来误解了~~

[ 本帖最后由 youngpennyu 于 2011-6-22 21:20 编辑 ]
2011-06-22 21:18
快速回复:访问违例(段异常)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033448 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved