Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中文件处理操作中的分段错误?_C_File_Unix - Fatal编程技术网

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

C中文件处理操作中的分段错误?,c,file,unix,C,File,Unix,我是UNIX中文件处理的新手,我不知道在哪里以及如何出现分段错误。是否有我没有分配的内存,或者实际打开和读取文件时有问题。注意:同一目录中有一个名为“hi.txt”的空文本文件 读.c #include <stdio.h> #include <string.h> FILE *fp; FILE *wp; void open(char *name) { char *outname = strcat(name, ".rzip"); fp = fopen(na

我是UNIX中文件处理的新手,我不知道在哪里以及如何出现分段错误。是否有我没有分配的内存,或者实际打开和读取文件时有问题。注意:同一目录中有一个名为“hi.txt”的空文本文件

读.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);
}

您的char*outname没有分配足够的内存来容纳连接的字符串

使用方法如下:

char*str2=“.rzip”;
char*outname=(char*)malloc(1+strlen(name)+strlen(str2));
strcpy(outname,name);
strcat(名字,str2);
fp=fopen(名称,“r”);
wp=fopen(简称“w”);

BLUEPIXY的评论很到位。您对字符串常量误用了
strcat

要在Linux中快速调试分段故障,您应该使用操作系统提供的核心转储功能

很简单:

  • 使用
    -g
    选项编译

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

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

    $ulimit-c unlimited

  • 运行程序

    $。/阅读
    分段故障(堆芯转储)

  • 检查是否已生成
    core
    文件

    $ls-l
    -rw------1用户01用户258048六月17日10:30核心
    -rw-r--r--1用户01用户144用户6月17日10:23 main.c
    -rwxr-xr-x 1用户01用户14960六月17日10:24读取
    -rw-r--r--1个用户01个用户300个用户6月17日10:23读.c

  • 在核心文件上运行gdb

    $gdb./read./core
    GNU gdb(gdb;openSUSE Leap 42.2)7.11.1
    版权所有(C)2016免费软件基金会。
    ...
    [新LWP 24468]
    核心由./read生成。
    程序以信号SIGSEGV终止,分段故障。
    0 0x000000000040071b处于打开状态(名称=0x400834“hi.txt”),位于read.c:9
    9 char*outname=strcat(名称“.rzip”);
    

  • 因此,您知道分段故障发生的确切线路


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

    “hi.txt”
    没有空间来组合其他字符串。例如
    open(“hi.txt”)-->
    字符文件名[256]=“hi.txt”;打开(文件名)并避免使用诸如
    open
    read
    write
    close
    @BLUEPIXY-Hmm之类的名称,我似乎仍然有seg故障。另外,我将接受您的建议并更改这些函数名。编辑:现在已经修好了。我应该改用什么名称?例如
    open
    -->
    my\u open
    void open(char *);
    char read();
    void write(char);
    void close();
    
    int main()
    {
        open("hi.txt");
        write('c');
        close();
    
        return 0;
    }