なぜ次のコードがSEGFAULTを上げるのか。 C(Linux)
-
01-10-2019 - |
質問
これは、ドキュメントのデータを逆にし、同じドキュメント自体に保存するコードです。しかし、私はセグメンテーションの欠陥を取得しています。助けてください、なぜそれが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);
}
編集1追加しようとしました:
#include <sys/stat.h>
struct stat fs;
fstat(fd, &fs);
n= fs.st_size;
buf = malloc(n * sizeof (char));
しかし、今では、ドキュメント内の文字内の文字を逆にするのではなく、何度も複製するだけです。
解決
2回目の編集に関しては、ループが間違っています。
(1)ループから読み取りと書き出しを取り出してください - それが、それが何度も何度も書き続けている理由です。
(2)ファイルの先頭に戻る必要があります。そうしないと、ファイルの最後に新しいデータを追加するだけです。
(3)書き出す前に、実際にバッファーのcharを逆にする必要があります。
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);
他のヒント
割り当ても初期化もしません buf
.
初期化されません n
だから、それは何でも、否定的でさえあるかもしれません。使用する fstat
または、ファイルのサイズを決定して保存する他の方法 n
.
バッファーは割り当てられておらずn = 0なので、0枚のCharsを読み取ろうとします。これにより、コードを修復する必要があります。
buf = malloc(10 * sizeof (char));
n = 10;
資力 :
所属していません StackOverflow