C中文件处理操作中的分段错误?

时间:2017-06-17 03:11:18

标签: c file unix

我是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;
}

2 个答案:

答案 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中快速调试分段错误,您应该使用操作系统提供的核心转储工具。

很简单:

  1. 使用-g选项

    进行编译

    $ gcc -o read main.c read.c -g

  2. 删除核心转储文件大小的限制

    $ ulimit -c unlimited

  3. 运行程序

    $ ./read Segmentation fault (core dumped)

  4. 检查是否已生成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

  5. 在核心文件

    上运行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");

  6. 因此,您知道发生分段错误的确切行。

    在现代发行版中,生成core文件变得更加复杂,将core文件的控制权转移到systemd。根据您的发行版,您可以使用coredumpctl实用程序来检索核心文件。