为什么以下代码会引发SegFault。 C(Linux的)

时间:2010-09-05 19:40:25

标签: c linux ubuntu segmentation-fault file-descriptor

这个代码可以反转文档的数据并将其保存在同一文档中。 但是我得到了一个Segmentation Fault.Please Help,我不知道为什么它会给SegFault。

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>


int main (int argc,char* argv[])
{

    int fd,n,i,j;

    char* buf;

    if(argc<2)
    printf("USAGE: %s file-to-reverse.\n",argv[0]);

    fd=open(argv[1], O_RDWR);
    if(fd==-1)
    printf("ERROR: Cannot reverse %s,file does not exist.\n",argv[1]);

    i = 0;
    j = n-1;

    while(i < j)
    {   
        read(fd,buf,n);

        char ib = buf[i];
        char jb = buf[j];

        jb = i++;
        ib = j--;

        write(fd,buf,n);
    }

    free(buf);
    close(fd);
}

EDIT1 我尝试添加:

#include <sys/stat.h>
struct stat fs;


  fstat(fd, &fs);
  n= fs.st_size;
  buf = malloc(n * sizeof (char));

但现在它只是一次又一次地复制文档中的字符而不是 扭转它们。

4 个答案:

答案 0 :(得分:2)

您不分配,也不初始化buf

答案 1 :(得分:2)

你从未初始化n所以它可能是任何东西,甚至是负面的。使用fstat或其他方法确定文件的大小并将其存储在n中。

答案 2 :(得分:2)

您的缓冲区未分配且n = 0,因此您将尝试读取0个字符。 这应该修复你的代码:

buf = malloc(10 * sizeof (char));
n = 10;

资源:

答案 3 :(得分:1)

关于你的第二次编辑 - 你的循环是错误的。

(1)阅读&amp;写出循环 - 这就是为什么它再次写作&amp;试。

(2)您需要回到文件的开头,否则您只需将新数据附加到文件的末尾。

(3)在写出来之前,你实际上必须反转缓冲区中的字符。

read(fd, buf, n);

while (i < j)
{

    char t = buf[i];

    buf[i] = buf[j];

    buf[j] = t;

    i++;
    j--;
}

lseek(fd, 0, SEEK_SET);

write(fd, buf, n);