0
int main(int argc,char* argv[]){
    int fd;
    off_t foffset;
    char* fpath;
    char* rbuf;
    if(argc!=2){
        printf("insert filename as argument!\n");
        exit(1);
    }
    strcpy(fpath,argv[1]);
    if( (fd = open(fpath,O_RDWR | O_APPEND)) <0 )
        perror("error on open()");
    //try to use lseek in file opened in O_APPEND mode
    char buf[] = "I'm appending some text!\n"; 
    if( write(fd, buf , sizeof(buf)) <0 )
        perror("error on write()");
    printf("the write() operation was succesful, let's try to seek and read the file..\n");
    foffset = lseek(fd,0L,SEEK_CUR);
    if(foffset<0)
        perror("error on lseek() :");
    close(fd);
    return 0;
}

このコードを実行するとセグメンテーション違反が発生するのはなぜですか?? segFault は、lseek 操作が追加された場合にのみ発生します。それ以外の場合は問題ありません。

4

2 に答える 2

2

fpathはワイルド ポインタです。つまり、 を呼び出す前にストレージを割り当てていませんstrcpy。ただしconst char *、ファイル名に必要なのは だけなので、次の変更を加えるだけです。

変化する:

strcpy(fpath,argv[1]);

に:

fpath = argv[1];
于 2013-03-12T15:15:29.873 に答える
0

個別に使用する場合はfpath、定義を変更します。

char fpath[30];

これで、期待どおりに動作しますstrcpy(ただし、文字列の長さが 30 未満であることを確認する必要があります)。ただし、他に何もしていないためargv[1]、に直接渡すことができます。open

于 2013-03-12T15:31:45.480 に答える