这个C程序为什么虚幻4 运行自动崩溃崩溃?

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 13, 距离下一级还需 187 积分
论坛徽章:0
开发的程序中,有重要数据写盘,使用的是缓冲io,当有bug或者什么原因导致程序非正常退出时,如何保证缓存io中的内容能flush到文件中?各位高手有什么方法?异常处理?信号捕获?
腰缠万贯, 积分 9361, 距离下一级还需 639 积分
论坛徽章:14
正确的做法是:解决掉bug
蒙骗过关的做法是:放到另一个进程中去
白手起家, 积分 13, 距离下一级还需 187 积分
论坛徽章:0
由于是个大系统,有很多个多人写的模块在,每个模块都可能出现bug,完全解决bug不太可能
放到另外一个进程是个办法,但改起来很复杂
还有其他办法吗
大富大贵, 积分 15632, 距离下一级还需 4368 积分
论坛徽章:0
异常处理吧。
win下有个函数叫SetUnhandledExceptionFilter,可以捕获异常。
还有既然是重要数据,为什么不做事务?
富足长乐, 积分 5503, 距离下一级还需 2497 积分
论坛徽章:2
文题不符啊。
题:程序退出操作系统会自动回收所有资源。
文:无解。
大富大贵, 积分 11521, 距离下一级还需 8479 积分
论坛徽章:248
那用无缓冲的io是不是好一些呢
腰缠万贯, 积分 9361, 距离下一级还需 639 积分
论坛徽章:14
walleeee 发表于
异常处理吧。
win下有个函数叫SetUnhandledExceptionFilter,可以捕获异常。
将 缓冲io 放在同一个锅内,既然异常了,就无法保证 缓冲io 还是正确的,而且不是每种异常都能正确消除,消除后还能正确运行的
白手起家, 积分 13, 距离下一级还需 187 积分
论坛徽章:0
无缓冲io的性能太差,不可取
windows下,我的确是用结构化异常来保证的,虽然可能发生异常是,理论上缓存中的数据是可能无效的,但目前看来挺好,因为现在有bug的发生地与文件io没有多大关系。
现在系统移到来linux下,windows代码无效了
我们的系统是处理网络数据报的,但需要7*24小时运行,万一程序崩溃了,保证已经处理的数据存文件了,退出。在监控脚本下再起来即可。
白手起家, 积分 76, 距离下一级还需 124 积分
论坛徽章:0
试试处理SIGSEGV
稍有积蓄, 积分 280, 距离下一级还需 220 积分
论坛徽章:1
在exception handler里面, 关掉所有的fd即可。
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处您当前位置: >
你的java/c/c++程序崩溃了?揭秘段错误(Segmentation fault)(3)
你的java/c/c++程序崩溃了?揭秘段错误(Segmentation fault)(3)
来源:程序员人生&& 发布时间: 07:58:45 阅读次数:2712次
你的C/C++程序为何没法运行?揭秘Segmentation fault (1)
你的C/C++程序为何没法运行?揭秘Segmentation fault (2)
写到这里,越跟,越发现真的是内核上很白,非1般的白。
但是既然是研究,就定住心,把段毛病弄到清楚明白。
本篇将作为终篇,来结束这个系列,也算是对段毛病和程序调试、寻觅崩溃缘由(通常不会给你那末完善的stackstrace和人性化的毛病提示)的再深入。
本篇使用到的工具或命令:
linux 内核3.10源码
上两篇围绕着1个这样的问题进行展开:
*p = (char *)malloc(sizeof(char));
为了本篇的可读性,围绕上述问题编织问题代码:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main(int argc,char** args) {
char * p = NULL;
第1步 strace 查信号描写
上篇已介绍了gbd+coredump的方法来找到出现段毛病的代码,本篇直接上strace:
strace -i -x -o segfault.txt ./segfault.o
得到以下信息:
可以知道:
1.毛病信号:SIGSEGV
3.毛病码:SEGV_MAPERR
3.毛病内存地址:0x0
4.逻辑地址0x400507处出错.
程序中有空指针访问试图向0x0写入而引发段毛病.
第2步 dmesg 查毛病现场
1.毛病类型:segfault ,即段毛病(Segmentation Fault).
2.出错时ip:0x400507
3.毛病号:6,即110
第3步 搜集已知结论
这里 毛病号和ip 是关键,毛病号对比下面:
* Page fault error code bits:
0: no page found
1: protection fault
0: kernel-mode
1: user-mode
1: use of reserved bit detected
1: fault was an instruction fetch
/*enum x86_pf_error_code {
对比后可知:
毛病号6 = 110 = (PF_USER | PF_WIRTE | 0).
即“用户态”、“写入型页毛病 ”、“没有与指定的地址相对应的页”.
上面的信息与我们最初的推断吻合.
现在,对目前已知结论进行概括以下:
1.毛病类型:segfualt ,即段毛病(Segmentation Fault).
2.出错时ip:0x400507
3.毛病号:6,即110
4.毛病码:SEGV_MAPERR
即地址没有映照到对象.
5.毛病缘由:对0x0进行写操作引发了段毛病,缘由是0x0没有与之对应的页或叫映照.
第4步 根据结论找到出错代码
gdb ./segfault.o
根据结论中的ip = 0x400507立即得到:
明显,这验证了我们的结论:
我们试图将值0x0写入地址0x0从而引发写入未映照的地址的段毛病.
并且我们找到了毛病的代码stack.c的第9行:
明显,我们不满足于此,为何访问了0x0会造成这个毛病从而让程序崩溃?
第2篇已说了进程虚拟地址空间的问题,事实上我们进行写入操作的时候,会引发虚拟地址到物理地址的映照,由于你终究要将数据(本篇是0x0,注意和我们的地址0x0辨别)写入到物理内存中。
0x0是个逻辑地址,linux按页式管理内存映照,0x0不会对应任何页,那末内存中就不会有主页,所以对其进行写入就会引发1个缺页中断,这1部份由linux内存映照管理模块(memory mapping,缩写mm)处理。
缺页毛病处理
1. __do_page_fault
缺页落后入__do_page_fault流程,注意,这里为了尽可能减少篇幅,删去了源代码的1些注释,而与我们有关的命中代码都做了注释:
static void __kprobes
__do_page_fault(struct pt_regs *regs, unsigned long error_code.)
struct vm_area_struct *
struct task_struct *
unsigned long
struct mm_struct *
int write = error_code & PF_WRITE;
unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
(write ? FAULT_FLAG_WRITE : 0);
mm = tsk-&
address = read_cr2();
if (kmemcheck_active(regs))
kmemcheck_hide(regs);
prefetchw(&mm-&mmap_sem);
if (unlikely(kmmio_fault(regs, address)))
if (unlikely(fault_in_kernel_space(address))) {
down_read(&mm-&mmap_sem);
might_sleep();
vma = find_vma(mm, address);
if (unlikely(!vma)) {
bad_area(regs, error_code, address);
2. bad_area
其中的1个关键调用bad_area(regs, error_code, address);
static noinline void
bad_area(struct pt_regs *regs, unsigned long error_code, unsigned long address)
__bad_area(regs, error_code, address, SEGV_MAPERR);
我们结论中的SEGV_MAPERR的出处.
这个类型就是没法映照到对象的意思!看下面strace得到的东西,其中
si_code=SEGV_MAPERR.
最后会来到这里:
static void
__bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,
unsigned long address, int si_code)
struct task_struct *tsk =
if (error_code & PF_USER) {
local_irq_enable();
if (address &= TASK_SIZE)
error_code |= PF_PROT;
if (likely(show_unhandled_signals))
show_signal_msg(regs, error_code, address, tsk);
tsk-&thread.cr2
tsk-&thread.error_code
tsk-&thread.trap_nr = X86_TRAP_PF;
force_sig_info_fault(SIGSEGV, si_code, address, tsk, 0);
注意上面的代码的两个关键调用:
show_signal_msg
force_sig_info_fault
3. show_signal_msg
static inline void
show_signal_msg(struct pt_regs *regs, unsigned long error_code,
unsigned long address, struct task_struct *tsk)
printk("%s%s[%d]: segfault at %lx ip %p sp %p error %lx",
task_pid_nr(tsk) & 1 ? KERN_INFO : KERN_EMERG,
tsk-&comm, task_pid_nr(tsk), address,
(void *)regs-&ip, (void *)regs-&sp, error_code);
print_vma_addr(KERN_CONT " in ", regs-&ip);
printk(KERN_CONT "
其中,打印段毛病的信息的代码,就是我们使用dmesg得到的东西.
可以对照下我们的段毛病的图:
最后就是发送信号了。
static void
force_sig_info_fault(int si_signo, int si_code, unsigned long address,
struct task_struct *tsk, int fault)
unsigned lsb = 0;
info.si_signo
info.si_errno
info.si_code
info.si_addr
= (void __user *)
if (fault & VM_FAULT_HWPOISON_LARGE)
lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault));
if (fault & VM_FAULT_HWPOISON)
lsb = PAGE_SHIFT;
info.si_addr_lsb =
force_sig_info(si_signo, &info, tsk);
force_sig_info:
force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
unsigned long int
int ret, blocked,
struct k_sigaction *
spin_lock_irqsave(&t-&sighand-&siglock, flags);
action = &t-&sighand-&action[sig-1];
if (action-&sa.sa_handler == SIG_DFL)
t-&signal-&flags &= ~SIGNAL_UNKILLABLE;
ret = specific_send_sig_info(sig, info, t);
spin_unlock_irqrestore(&t-&sighand-&siglock, flags);
上面的代码告知我们,信号的处理程序如何被指定的,那末关于段毛病的信号SEGSIGV默许就是core dump.
5. core dump
到此,我们已可以拿到core dump,那末第2篇中找到引发段毛病的代码的方法就能够用了,这也是推荐的做法:
gdb ./segfault.o core.36054
是否是立便可知stack.c第9行的代码*p = 0x0是罪魁罪魁了呢?
到此,全部段毛病的探索就结束了,希望读者和我1样不枉此行。
列出几种常见段毛病缘由:
1.数组越界
int a[10] = {0,1};
printf("%d",a[10000]);
2.零指针或空指针
char * p = NULL;
3.悬浮指针
如果指针p悬浮,它指向的地址有可能能用,也有可能不能,你不知道那块地址甚么时候被写入,甚么时候被保护(mprotect).
如果被保护为可读,你写就出现段毛病!
4.访问权限,非法访问
5.多线程对同享指针变量操作
不但c/c++,android中、java程序中有可能也会出现jvm崩溃哦,那检查下多线程的同享变量吧!
如有毛病,请不吝赐教.
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
------分隔线----------------------------
------分隔线----------------------------
积分:4237共被编辑 3 次
C语言词频统计程序在统计大量数据时(超过30MB)就会崩溃,原因是什么?
代码如下:
#include&stdio.h&
#include&stdlib.h&
#include&string.h&
#define Max 200
typedef struct BSTNode* BSTT
struct BSTNode{
char W[Max];
BSTTree Left,R
BSTTree T,BT;
//函数声明
void readfile();
void wordread(FILE *fp);
char* wordhandle(char *w);
BSTTree InsertNode(BSTTree T,char *wd);
void InorderPrint(BSTTree T);
BSTTree InsertBSTNode(BSTTree BT,char* wd,int ct);
void InorderPrintBST(FILE* yp,BSTTree BT);
//打开文件
void readfile()
char s[Max];
np=fopen("F:\\all_names.txt","w");
fclose(np);
system("dir F:\\hello\\*.txt /s /b
&& F:\\all_names.txt");
hp=fopen("F:\\all_names.txt","r");
if(hp==NULL)
printf("不能打开文件\n");
fscanf(hp,"%s",s);
while(!feof(hp))
fp=fopen(s,"r");
if(fp==NULL)
printf("不能打开文件\n");
wordread(fp);
//在这里读入数据(填写读入单词函数)
fclose(fp);
fscanf(hp,"%s",s);
fclose(hp);
//读入单词
void wordread(FILE *fp)
char *delim=" @(),.?:;+$!#/\"";
char temp[Max];
char wd[Max];
fscanf(fp,"%s",temp);
while(!feof(fp))
p=strtok(temp,delim);
while(p!=NULL)
strcpy(wd,p);
wordhandle(wd);
//对单词进行处理
T = InsertNode(T,wd);
//存入链表
p=strtok(NULL,delim);
fscanf(fp,"%s",temp);
//对单词进行处理
char* wordhandle(char *w)
if(w[0]=='\'')
for(i=0;i&strlen(w);i++)
w[i]=w[i+1];
if(w[0]&='Z'&&w[0]&='A')
if(w[1]&='Z'&&w[1]&='A')
BSTTree InsertNode(BSTTree T,char *wd){
if(T==NULL){
T = (BSTTree)malloc(sizeof(struct BSTNode));
strcpy(T-&W,wd);
T-&Count = 1;
T-&Left = T-&Right = NULL;
else if((m=strcmp(T-&W,wd))==0){
T-&Count++;
else if(m&0){
T-&Left = InsertNode(T-&Left,wd);
else if(m&0){
T-&Right = InsertNode(T-&Right,wd);
void InorderPrint(BSTTree T){
BT=InsertBSTNode(BT,T-&W,T-&Count);
//将单词输入到第二个BST中;
InorderPrint(T-&Left);
InorderPrint(T-&Right);
BSTTree InsertBSTNode(BSTTree BT,char *wo,int ct){
if(BT==NULL){
BT = (BSTTree)malloc(sizeof(struct BSTNode));
BT-&Count =
strcpy(BT-&W,wo);
BT-&Left = BT-&Right = NULL;
else if(BT-&Count&ct){
BT-&Left = InsertBSTNode(BT-&Left,wo,ct);
else if(BT-&Count&ct){
BT-&Right = InsertBSTNode(BT-&Right,wo,ct);
else if(BT-&Count==ct){
BSTTree T1;
T1 = (BSTTree)malloc(sizeof(struct BSTNode));
T1-&Count =
strcpy(T1-&W,wo);
T1-&Left = NULL;
T1-&Right = BT-&R
BT-&Right = T1;
return BT;
void InorderPrintBST(FILE* yp,BSTTree BT){
InorderPrintBST(yp,BT-&Left);
fprintf(yp,"%s ",BT-&W);
fprintf(yp," %d",BT-&Count);
fprintf(yp,"\n");
InorderPrintBST(yp,BT-&Right);
int main()
yp = fopen("F:\\结果.txt","w");
readfile();
InorderPrint(T);
InorderPrintBST(yp,BT);
C语言词频统计程序在统计大量数据时(超过430MB)就会崩溃,原因是什么?
#include&stdio.h&
#include&stdlib.h&
#include&string.h&
#define Max 200
typedef struct BSTNode* BSTT
struct BSTNode{
char W[Max];
BSTTree Left,R
BSTTree T,BT;
//函数声明
void readfile();
void wordread(FILE *fp);
char* wordhandle(char *w);
BSTTree InsertNode(BSTTree T,char *wd);
void InorderPrint(BSTTree T);
BSTTree InsertBSTNode(BSTTree BT,char* wd,int ct);
void InorderPrintBST(FILE* yp,BSTTree BT);
//打开文件
void readfile()
char s[Max];
np=fopen("F:\\all_names.txt","w");
fclose(np);
system("dir F:\\hello\\*.txt /s /b
&& F:\\all_names.txt");
hp=fopen("F:\\all_names.txt","r");
if(hp==NULL)
printf("不能打开文件\n");
fscanf(hp,"%s",s);
while(!feof(hp))
fp=fopen(s,"r");
if(fp==NULL)
printf("不能打开文件\n");
wordread(fp);
//在这里读入数据(填写读入单词函数)
fclose(fp);
fscanf(hp,"%s",s);
fclose(hp);
//读入单词
void wordread(FILE *fp)
char *delim=" @(),.?:;+$!#/\"";
char temp[Max];
char wd[Max];
fscanf(fp,"%s",temp);
while(!feof(fp))
p=strtok(temp,delim);
while(p!=NULL)
strcpy(wd,p);
wordhandle(wd);
//对单词进行处理
T = InsertNode(T,wd);
//存入链表
p=strtok(NULL,delim);
fscanf(fp,"%s",temp);
//对单词进行处理
char* wordhandle(char *w)
if(w[0]=='\'')
for(i=0;i&strlen(w);i++)
w[i]=w[i+1];
if(w[0]&='Z'&&w[0]&='A')
if(w[1]&='Z'&&w[1]&='A')
BSTTree InsertNode(BSTTree T,char *wd){
if(T==NULL){
T = (BSTTree)malloc(sizeof(struct BSTNode));
strcpy(T-&W,wd);
T-&Count = 1;
T-&Left = T-&Right = NULL;
else if((m=strcmp(T-&W,wd))==0){
T-&Count++;
else if(m&0){
T-&Left = InsertNode(T-&Left,wd);
else if(m&0){
T-&Right = InsertNode(T-&Right,wd);
void InorderPrint(BSTTree T){
BT=InsertBSTNode(BT,T-&W,T-&Count);
//将单词输入到第二个BST中;
InorderPrint(T-&Left);
InorderPrint(T-&Right);
BSTTree InsertBSTNode(BSTTree BT,char *wo,int ct){
if(BT==NULL){
BT = (BSTTree)malloc(sizeof(struct BSTNode));
BT-&Count =
strcpy(BT-&W,wo);
BT-&Left = BT-&Right = NULL;
else if(BT-&Count&ct){
BT-&Left = InsertBSTNode(BT-&Left,wo,ct);
else if(BT-&Count&ct){
BT-&Right = InsertBSTNode(BT-&Right,wo,ct);
else if(BT-&Count==ct){
BSTTree T1;
T1 = (BSTTree)malloc(sizeof(struct BSTNode));
T1-&Count =
strcpy(T1-&W,wo);
T1-&Left = NULL;
T1-&Right = BT-&R
BT-&Right = T1;
return BT;
void InorderPrintBST(FILE* yp,BSTTree BT){
InorderPrintBST(yp,BT-&Left);
fprintf(yp,"%s ",BT-&W);
fprintf(yp," %d",BT-&Count);
fprintf(yp,"\n");
InorderPrintBST(yp,BT-&Right);
int main()
yp = fopen("F:\\结果.txt","w");
readfile();
InorderPrint(T);
InorderPrintBST(yp,BT);
C语言词频统计程序在统计大量数据时(超过430MB)就会崩溃,原因是什么?
include&stdio.h&
include&stdlib.h&
include&string.h&
define Max 200
typedef struct BSTNode* BSTTstruct BSTNode{
char W[Max];
BSTTree Left,R
};BSTTree T,BT;//函数声明 void readfile();void wordread(FILE *fp);char wordhandle(char w);BSTTree InsertNode(BSTTree T,char *wd);void InorderPrint(BSTTree T);BSTTree InsertBSTNode(BSTTree BT,char* wd,int ct);void InorderPrintBST(FILE* yp,BSTTree BT);
//打开文件 void readfile(){
char s[Max];
np=fopen("F:\\all_names.txt","w");
fclose(np);
system("dir F:\\hello\\*.txt /s /b
&& F:\\all_names.txt");
hp=fopen("F:\\all_names.txt","r");
if(hp==NULL)
printf("不能打开文件\n");
fscanf(hp,"%s",s);
while(!feof(hp))
fp=fopen(s,"r");
if(fp==NULL)
printf("不能打开文件\n");
wordread(fp);
//在这里读入数据(填写读入单词函数)
fclose(fp);
fscanf(hp,"%s",s);
fclose(hp);
}//读入单词 void wordread(FILE *fp){
char *delim=" @(),.?:;+$!#/\"";
char temp[Max];
char wd[Max];
fscanf(fp,"%s",temp);
while(!feof(fp))
p=strtok(temp,delim);
while(p!=NULL)
strcpy(wd,p);
wordhandle(wd);
//对单词进行处理
T = InsertNode(T,wd);
//存入链表
p=strtok(NULL,delim);
fscanf(fp,"%s",temp);
}//对单词进行处理char wordhandle(char w){
if(w[0]=='\'')
for(i=0;i&strlen(w);i++)
w[i]=w[i+1];
if(w[0]&='Z'&&w[0]&='A')
if(w[1]&='Z'&&w[1]&='A')
}BSTTree InsertNode(BSTTree T,char *wd){
if(T==NULL){
T = (BSTTree)malloc(sizeof(struct BSTNode));
strcpy(T-&W,wd);
T-&Count = 1;
T-&Left = T-&Right = NULL;
else if((m=strcmp(T-&W,wd))==0){
T-&Count++;
else if(m&0){
T-&Left = InsertNode(T-&Left,wd);
else if(m&0){
T-&Right = InsertNode(T-&Right,wd);
}void InorderPrint(BSTTree T){
BT=InsertBSTNode(BT,T-&W,T-&Count);
//将单词输入到第二个BST中;
InorderPrint(T-&Left);
InorderPrint(T-&Right);
}BSTTree InsertBSTNode(BSTTree BT,char *wo,int ct){
if(BT==NULL){
BT = (BSTTree)malloc(sizeof(struct BSTNode));
BT-&Count =
strcpy(BT-&W,wo);
BT-&Left = BT-&Right = NULL;
else if(BT-&Count&ct){
BT-&Left = InsertBSTNode(BT-&Left,wo,ct);
else if(BT-&Count&ct){
BT-&Right = InsertBSTNode(BT-&Right,wo,ct);
else if(BT-&Count==ct){
BSTTree T1;
T1 = (BSTTree)malloc(sizeof(struct BSTNode));
T1-&Count =
strcpy(T1-&W,wo);
T1-&Left = NULL;
T1-&Right = BT-&R
BT-&Right = T1;
return BT;
}void InorderPrintBST(FILE* yp,BSTTree BT){
InorderPrintBST(yp,BT-&Left);
fprintf(yp,"%s ",BT-&W);
fprintf(yp," %d",BT-&Count);
fprintf(yp,"\n");
InorderPrintBST(yp,BT-&Right);
}int main(){
yp = fopen("F:\\结果.txt","w");
readfile();
InorderPrint(T);
InorderPrintBST(yp,BT);
我要该,理由是:欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 1253 人关注过本帖
标题:求指点~一个编译没有错但运行总崩溃的程序,谢谢
等 级:新手上路
帖 子:57
结帖率:83.33%
&&已结贴√
&&问题点数:20&&回复次数:5&&&
求指点~一个编译没有错但运行总崩溃的程序,谢谢
目的是想要删除文件中的一个航班信息,然后再把删除的航班信息读出,这个程序编译没有错,但是总是崩溃,求指点
#include&stdio.h&
#include&stdlib.h&
#include&string.h&
#define whole 81
void deleteFlight();
struct flyline
&&&&&&&&char fnum[whole];
&&&&&&&&char fcompany[whole];
&&&&&&&&char fstart[whole];
&&&&&&&&char fend[whole];
&&&&&&&&char fstime[whole];
&&&&&&&&char ftime[whole];
&&&&&&&&char ftype[whole];
&&&&&&&&char frate[whole];
&&&&&&&&char ftprice[whole];
&&&&&&&&char ftrest[whole];
&&&&&&&&char fyprice[whole];
&&&&&&&&char fyrest[whole];
&&&&&&&&char fp1[whole];
&&&&&&&&char fp2[whole];
&&& struct flyline line[31]={{&航班号&,&所属公司&,&出发地&,&降落地&,&起飞时间&,&预计飞行时间&,&机型&,&准点率&,&头等舱票价&,&头等舱剩余座位&,&经济舱票价&,&经济舱剩余座位&,&驾驶员&,&副驾驶\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC8835&,&山东航空公司&,&北京&,&珠海&,&6:35&,&210min&,&738&,&93%&,&¥5080&,&6&,&¥2030&,&33&,&Zhao Yi&,&Zhao Er\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC1195&,&山东航空公司&,&北京&,&银川&,&7:05&,&135min&,&738&,&98%&,&¥3540&,&8&,&¥1180&,&25&,&zhao san&,&zhao si\n&},&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC4785&,&山东航空公司&,&北京&,&盐城&,&8:00&,&115min&,&738&,&80%&,&¥1960&,&2&,&¥980&,&12&,&zhao wu&,&zhao liu\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC4852&,&山东航空公司&,&北京&,&青岛&,&9:50&,&90min&,&747&,&90%&,&¥1640&,&5&,&¥820&,&34& ,&zhao qi&,&zhao ba\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC4882&,&山东航空公司&,&北京&,&珠海&,&10:45&,&240min&,&635&,&96%&,&¥5240&,&2&,&¥2320&,&11&,&zhao jiu&,&zhao shi\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC4854&,&山东航空公司&,&北京&,&烟台&,&13:45&,&100min&,&482&,&92%&,&¥4200&,&0&,&¥2100&,&9&,&qian yi&,&qian er\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC4678&,&山东航空公司&,&北京&,&厦门&,&15:20&,&100min&,&482&,&95%&,&¥2440&,&5&,&¥1220&,&17&,&qian san&,&qian si\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC4856&,&山东航空公司&,&北京&,&重庆&,&20:05&,&185min&,&738&,&85%&,&¥3860&,&1&,&¥1980&,&3&,&qian wu&,&qian liu\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8548&,&四川航空公司&,&成都&,&北京&,&6:25&,&190min&,&321&,&78%&,&¥4730&,&3&,&¥1690&,&28&,&qian qi&,&qian ba\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8303&,&四川航空公司&,&哈尔滨&,&北京&,&6:50&,&120min&,&319&,&81%&,&¥3050&,&7&,&¥1520&,&13&,&qian jiu&,&qian shi\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8896&,&四川航空公司&,&西昌&,&北京&,&7:25&,&305min&,&320&,&91%&,&¥4820&,&3&,&¥2410&,&3&,&sun yi&,&sun er\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8838&,&四川航空公司&,&昆明&,&北京&,&8:10&,&295min&,&320&,&87%&,&¥3460&,&0&,&¥1730&,&23&,&sun san&,&sun si\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8832&,&四川航空公司&,&万县&,&北京&,&17:30&,&140min&,&319&,&86%&,&¥2850&,&4&,&¥1920&,&5&,&sun wu&,&sun liu\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8894&,&四川航空公司&,&成都&,&北京&,&19:30&,&190min&,&320&,&90%&,&¥4730&,&1&,&¥1690&,&0&,&sun qi&,&sun ba\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8830&,&四川航空公司&,&重庆&,&北京&,&10:45&,&195min&,&321&,&87%&,&¥3660&,&4&,&¥1820&,&31&,&sun jiu&,&sun shi\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8892&,&四川航空公司&,&三亚&,&北京&,&7:55&,&245min&,&321&,&93%&,&¥3870&,&2&,&¥1980&,&19&,&li san&,&li si\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& };
int main()
&&&&&&&&&&&char fnum3[8];
&&&&&&&&int n3_3=0;
&&&&&&&&if((fline=fopen(&finformation.txt&,&rb&))==NULL)/*打开文件*/
&&&&&&&&&&&&printf(&文件读取失败……&);
&&&&&&&&&&&&exit(0);
&&&&&&&&printf(&请输入您要删除的航班号:\n&);
&&&&&&&&scanf(&%s&,&fnum3);/*管理员输入想删除的航班号*/
&&&&&&&&while(!feof(fline))/*统计全部航班信息个数*/
&&&&&&&&&{
&&&&&&&&&&&& fread(&line[n3_3],sizeof(struct flyline),1,fline);
&&&&&&&&&&&& n3_3++;
&&&&&&&&&}
&&&&&&&&&for (i = 0; i&n3_3; i++) /*依次对比检查*/
&&&&&&&&&{
&&&&&&&&&&&&if (strcmp(line[i].fnum, fnum3) == 0)
&&&&&&&&&&&&
&&&&&&&&&}
&&&&&&&&&for (; i&n3_3; i++) /*删除航班*/
&&&&&&&&&{
&&&&&&&&&&&& line[i]=line[i+1];
&&&&&&&&&&&& n3_3=n3_3-1;
&&&&&&&&&&&& printf(&成功删除!\n&);
&&&&&&&&& }
&&&&&&&&&if(i==n3_3);
&&&&&&&&&printf(&没有该航班号!\n&);
&&&&&&&&&for (i = 0; i&n3_3; i++) /*写入文件*/
&&&&&&&&&fwrite(&line[i],sizeof(struct flyline) , 1, fline);
&&&&&&&&&fclose(fline);
&&&&&&&&&int d1;
&&&&&&&&if((fline=fopen(&finformation.txt&,&rb&))==NULL)
&&&&&&&&&&&printf(&文件读取失败……&);
&&&&&&&&& for(d1=0;d1&n3_3;d1++)
&&&&&&&&&&&&fread(&line[d1],sizeof(struct flyline),1,fline);
&&&&&&&&&&&&printf(&&&%-8s%-14s%-8s%-8s%-10s%-14s%-7s%-8s%-12s%-16s%-12s%-16s%-10s%-6s&,line[d1].fnum,line[d1].fcompany,line[d1].fstart,line[d1].fend,line[d1].fstime,line[d1].ftime,line[d1].ftype,line[d1].frate,line[d1].ftprice,line[d1].ftrest,line[d1].fyprice,line[d1].fyrest,line[d1].fp1,line[d1].fp2);
&&&&&&&&&&&fclose(fline);
搜索更多相关主题的帖子:
等 级:版主
威 望:27
帖 子:1586
专家分:2894
把文件传上来先。
等 级:新手上路
帖 子:57
回复 2楼 ehszt
附件: 您没有浏览附件的权限,请
等 级:版主
威 望:27
帖 子:1586
专家分:2894
&&得分:20&
回复 3楼 是心愿
你的文件已经多次叠加了,没有用,为了你的程序我又生成了一个文件。
程序也改正过,没问题。真有点累
#include&stdio.h&
&#include&stdlib.h&
&#include&string.h&
&#define whole 81
&void deleteFlight();
&struct flyline
&&&&&&&&&char fnum[whole];
&&&&&&&&&char fcompany[whole];
&&&&&&&&&char fstart[whole];
&&&&&&&&&char fend[whole];
&&&&&&&&&char fstime[whole];
&&&&&&&&&char ftime[whole];
&&&&&&&&&char ftype[whole];
&&&&&&&&&char frate[whole];
&&&&&&&&&char ftprice[whole];
&&&&&&&&&char ftrest[whole];
&&&&&&&&&char fyprice[whole];
&&&&&&&&&char fyrest[whole];
&&&&&&&&&char fp1[whole];
&&&&&&&&&char fp2[whole];
&&&&&struct flyline line[31]={{&航班号&,&所属公司&,&出发地&,&降落地&,&起飞时间&,&预计飞行时间&,&机型&,&准点率&,&头等舱票价&,&头等舱剩余座位&,&经济舱票价&,&经济舱剩余座位&,&驾驶员&,&副驾驶\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC8835&,&山东航空公司&,&北京&,&珠海&,&6:35&,&210min&,&738&,&93%&,&¥5080&,&6&,&¥2030&,&33&,&Zhao Yi&,&Zhao Er\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC1195&,&山东航空公司&,&北京&,&银川&,&7:05&,&135min&,&738&,&98%&,&¥3540&,&8&,&¥1180&,&25&,&zhao san&,&zhao si\n&},&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {&SC4785&,&山东航空公司&,&北京&,&盐城&,&8:00&,&115min&,&738&,&80%&,&¥1960&,&2&,&¥980&,&12&,&zhao wu&,&zhao liu\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {&SC4852&,&山东航空公司&,&北京&,&青岛&,&9:50&,&90min&,&747&,&90%&,&¥1640&,&5&,&¥820&,&34& ,&zhao qi&,&zhao ba\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {&SC4882&,&山东航空公司&,&北京&,&珠海&,&10:45&,&240min&,&635&,&96%&,&¥5240&,&2&,&¥2320&,&11&,&zhao jiu&,&zhao shi\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC4854&,&山东航空公司&,&北京&,&烟台&,&13:45&,&100min&,&482&,&92%&,&¥4200&,&0&,&¥2100&,&9&,&qian yi&,&qian er\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC4678&,&山东航空公司&,&北京&,&厦门&,&15:20&,&100min&,&482&,&95%&,&¥2440&,&5&,&¥1220&,&17&,&qian san&,&qian si\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&SC4856&,&山东航空公司&,&北京&,&重庆&,&20:05&,&185min&,&738&,&85%&,&¥3860&,&1&,&¥1980&,&3&,&qian wu&,&qian liu\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8548&,&四川航空公司&,&成都&,&北京&,&6:25&,&190min&,&321&,&78%&,&¥4730&,&3&,&¥1690&,&28&,&qian qi&,&qian ba\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8303&,&四川航空公司&,&哈尔滨&,&北京&,&6:50&,&120min&,&319&,&81%&,&¥3050&,&7&,&¥1520&,&13&,&qian jiu&,&qian shi\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8896&,&四川航空公司&,&西昌&,&北京&,&7:25&,&305min&,&320&,&91%&,&¥4820&,&3&,&¥2410&,&3&,&sun yi&,&sun er\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8838&,&四川航空公司&,&昆明&,&北京&,&8:10&,&295min&,&320&,&87%&,&¥3460&,&0&,&¥1730&,&23&,&sun san&,&sun si\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8832&,&四川航空公司&,&万县&,&北京&,&17:30&,&140min&,&319&,&86%&,&¥2850&,&4&,&¥1920&,&5&,&sun wu&,&sun liu\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8894&,&四川航空公司&,&成都&,&北京&,&19:30&,&190min&,&320&,&90%&,&¥4730&,&1&,&¥1690&,&0&,&sun qi&,&sun ba\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8830&,&四川航空公司&,&重庆&,&北京&,&10:45&,&195min&,&321&,&87%&,&¥3660&,&4&,&¥1820&,&31&,&sun jiu&,&sun shi\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&3U8892&,&四川航空公司&,&三亚&,&北京&,&7:55&,&245min&,&321&,&93%&,&¥3870&,&2&,&¥1980&,&19&,&li san&,&li si\n&},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&};
&int main()
&&&&&&&&&&&&char fnum3[8];
&&&&&&&&&int i,k;
&&&&&&&&&int n3_3=0;
&&&&&&&&&if((fline=fopen(&finformation.txt&,&r&))==NULL)/*打开文件*/
&&&&&&&&&&&& printf(&文件读取失败……&);
&&&&&&&&&&&& exit(0);
&&&&&&&&&printf(&请输入您要删除的航班号:\n&);
&&&&&&&&&scanf(&%s&,fnum3);/*管理员输入想删除的航班号*/
&&&&&&&&&while(!feof(fline))
&&&&&&&&& {
&&&&&&&&&&&&&&fread(&line[n3_3],sizeof(struct flyline),1,fline);
&&&&&&&&&&&&&&n3_3++;
&&&&&&&&& }
&&&&&&&&&&&fclose(fline);
&&&&&&&&& for (i = 0; i&n3_3-1; i++) /*依次对比检查*/
&&&&&&&&& {
&&&&&&&&&&&& if (strcmp(line[i].fnum, fnum3) == 0)
&&&&&&&&&&&&
&&&&&&&&& }
&&&&&&&&& getchar();
&&&&&&&&& if(i!=n3_3-1)
&&&&&&&&& {
&&&&&&&&&&&&&&&for (; i&n3_3-1; i++) /*删除航班*/
&&&&&&&&& {
&&&&&&&&&&&&&&line[i]=line[i+1];
&&&&&&&&&&&&&&
&&&&&&&&&&&}
&&&&&&&&&&&&memset(&line[i],0,sizeof(struct flyline));
&&&&&&&&&&&&printf(&成功删除!\n&);
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&if((fline=fopen(&finformation.txt&,&w&))==NULL)/*打开文件*/
&&&&&&&&&&&& printf(&文件读取失败……&);
&&&&&&&&&&&& exit(0);
&&&&&&&&&&&&for (i = 0,k=0;i&n3_3-2; i++)
&&&&&&&&&&&&{
&&&&&&&&&&&&
&&&&&&&&&&&&&&& fwrite(&line[i],sizeof(struct flyline) , 1, fline);
&&&&&&&&&&&&&&&&&&&&k++;
&&&&&&&&&&&&}
&&&&&&&&& }
&&&&&&&&& else
&&&&&&&&& {
&&&&&&&&&&&&&&printf(&没有该航班号!\n&);
&&&&&&&&&&&&&&k=n3_3-1;
&&&&&&&&& }
&&&&&&&&& getchar();
&&&&&&&&& fclose(fline);
&&&&&&&&& int d1;
&&&&&&&&&if((fline=fopen(&finformation.txt&,&r&))==NULL)
&&&&&&&&&{
&&&&&&&&&&&&printf(&文件读取失败……&);
&&&&&&&&&}
&&&&&&&&&&&for(d1=0;d1&k;d1++)
&&&&&&&&&{
&&&&&&&&&&&& fread(&line[d1],sizeof(struct flyline),1,fline);
&&&&&&&&&&&& printf(&&&%-8s%-14s%-8s%-8s%-10s%-14s%-7s%-8s%-12s%-16s%-12s%-16s%-10s%-6s&,line[d1].fnum,line[d1].fcompany,line[d1].fstart,line[d1].fend,line[d1].fstime,line[d1].ftime,line[d1].ftype,line[d1].frate,line[d1].ftprice,line[d1].ftrest,line[d1].fyprice,line[d1].fyrest,line[d1].fp1,line[d1].fp2);
&&&&&&&&&}
&&&&&&&&&&&&fclose(fline);
&&&&&&&&&&&&fflush(stdin);
&&&&&&&&&&&&getchar();
附件: 您没有浏览附件的权限,请
等 级:版主
威 望:27
帖 子:1586
专家分:2894
这个程序只能配和我上传的文件使用
等 级:新手上路
帖 子:57
回复 5楼 ehszt
谢谢您,辛苦了!都是我基础太差。。要编的程序也有点复杂。。
我会好好学习C语言的
版权所有,并保留所有权利。
Powered by , Processed in 0.056223 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved

我要回帖

更多关于 虚幻4 运行自动崩溃 的文章

 

随机推荐