| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1958 人关注过本帖
标题:访问违例(段异常)
只看楼主 加入收藏
youngpennyu
Rank: 2
等 级:论坛游民
帖 子:37
专家分:19
注 册:2011-6-13
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:27 
访问违例(段异常)
程序代码:
#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
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
收藏
得分:0 
卡哇伊!
a[1]当做字符串,楼主觉得可以?单单\0就占一个字符了。
2011-06-22 19:32
youngpennyu
Rank: 2
等 级:论坛游民
帖 子:37
专家分:19
注 册:2011-6-13
收藏
得分:0 
我也觉得不可以因为不有个\0  但是后面的数组却没有问题又是为什么呢?
2011-06-22 19:33
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
后面一样有问题,但是不会被执行,因为已经发生异常了。

不过我却不知道为什么这里会出现段异常。期待高手解答
2011-06-22 20:37
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:15 
啊~我了解了。
如果楼主把字符数组的长度定义为 1 或在读取字符串的时候,输入字符串的长度超过了数组长度,那么,文件指针 fp 的值就有可能被覆盖。
而在执行 fputs() 的时候会向 fp 指向的内存区域中写入数据。由于之前读取字符串的时候改变了 fp 的值,即 fp 所指向的内存单元地址,因此,有可能引发段异常
2011-06-22 20:46
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
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 7楼 youngpennyu
你可以只要最后的 gets(m) 之后的代码,然后输入一个很长的字符串试试,看看段异常不

6 楼所述情况是因为你恰好没有覆盖 fp 的值。

[ 本帖最后由 voidx 于 2011-6-22 20:56 编辑 ]
2011-06-22 20:55
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
快速回复:访问违例(段异常)
数据加载中...
 
   



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

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