我是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;
}
答案 0 :(得分: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");
答案 1 :(得分:0)
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
文件变得更加复杂,将core
文件的控制权转移到systemd
。根据您的发行版,您可以使用coredumpctl
实用程序来检索核心文件。