[英]Segmenation fault in file handling operations in C?
我是UNIX中文件处理的新手,我不知道在哪里以及如何遇到分段错误。 是否有我没有分配的内存,或者实际打开和读取文件是否有问题? 注意:在同一目录中有一个名为“ hi.txt”的空文本文件。
read.c
#include <stdio.h>
#include <string.h>
FILE *fp;
FILE *wp;
void open(char *name)
{
char *outname = strcat(name, ".rzip");
fp = fopen(name, "r");
wp = fopen(outname, "w");
}
char read()
{
return getc(fp);
}
void write(char c)
{
putc(c, wp);
}
void close()
{
fclose(fp);
}
main.c中
void open(char *);
char read();
void write(char);
void close();
int main()
{
open("hi.txt");
write('c');
close();
return 0;
}
您的char * outname没有足够的内存来分配串联的字符串。
在下面使用:
char *str2 = ".rzip";
char * outname = (char *) malloc(1 + strlen(name)+ strlen(str2) );
strcpy(outname, name);
strcat(outname, str2);
fp = fopen(name, "r");
wp = fopen(outname, "w");
BLUEPIXY的评论很明显。 您正在对字符串常量滥用strcat
。
要在Linux中快速调试分段错误,应使用操作系统提供的核心转储工具。
很简单:
用-g
选项编译
$ gcc -o read main.c read.c -g
取消核心转储文件大小的限制
$ ulimit -c unlimited
运行程序
$ ./read Segmentation fault (core dumped)
检查core
文件是否已生成
$ ls -l -rw------- 1 user01 users 258048 Jun 17 10:30 core -rw-r--r-- 1 user01 users 144 Jun 17 10:23 main.c -rwxr-xr-x 1 user01 users 14960 Jun 17 10:24 read -rw-r--r-- 1 user01 users 300 Jun 17 10:23 read.c
在核心文件上运行gdb
$ gdb ./read ./core GNU gdb (GDB; openSUSE Leap 42.2) 7.11.1 Copyright (C) 2016 Free Software Foundation, Inc. ... [New LWP 24468] Core was generated by ./read. Program terminated with signal SIGSEGV, Segmentation fault. 0 0x000000000040071b in open (name=0x400834 "hi.txt") at read.c:9 9 char *outname = strcat(name, ".rzip");
因此,您知道发生分段错误的确切行。
在现代发行版中,随着对core
文件的控制权转移到systemd
生成core
文件变得更加复杂。 根据您的发行版,您可以使用coredumpctl
实用程序来检索核心文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.