2017-10-28 17 views
0

私はCC文字列の変更

でプログラムするとき、私はoldPacket.filename = "fallout.jpg" //を使用する場合、私はfallout.jpgというファイルがあり、構造体は

のchar *型のファイル名でoldPakcetと呼ばれる混乱して問題に出くわしました

プログラムは非常にうまくいった

今、私はファイル名を入れて、ファイルの存在を確認するユーザーにすることにしました。プログラムはもはや働いているしかし、私は

while (Searchfile(&oldPacket)){ 
    printf("Please input the file name in the format: ftp <file name> \n"); 
} 

でこの関数を呼び出していないし、それは誰もがいくつかのアイデア理由を持っている

int filesize; 
    fp = fopen(oldPacket.filename, "rb"); 
    fseek(fp, 0L, SEEK_END);//here is the seg fault 
でワンセグ障害を示し

bool Searchfile(packet* ptr) { 
    char userinput[100]; 
    fgets(userinput, sizeof (userinput), stdin); //non terminated input by fgets 
    userinput[strcspn(userinput, "\n")] = 0; 
    //printf("%d\n",strlen(userinput)); 
    ptr->filename = userinput + 4;//i skip the first 4 char since the correnct format is ftp <filename> 
    printf("%s\n",ptr->filename); 
    printf("%d\n",strlen(ptr->filename)); 
    ptr->filename[strlen(ptr->filename)] = '\0'; 
    if (access(ptr->filename, F_OK) != -1) { 
     printf("exist\n"); 
     return false; 
    } else { 
     //printf("does not exist\n"); 
     return true; 
    } 
} 

:私は次の関数を書きましたこれが起こる?

あなたはローカル変数userinputのアドレスにptr->filenameポイントを聞かせ、そしてuserinputがいったんこの値にアクセスし、事前

+0

範囲外になるスタック上の変数へのポインタを返します。 – orhtej2

+1

また、segフォルトの場所を見ると、 "fp"という値に興味があるかもしれません。 –

答えて

2

おかげで....私はすでにファイル名の各文字をprintfのと、それは正しく見えますスコープの外に出ると、未定義の動作になります。

segfaultの理由は、おそらくSearchfileの外部にアクセスされたときにfilenameの値がガベージでファイルが開かれないことがあります。その後のfseekは、これはあなたがマルチスレッド環境で作業していない、少なくともとき、static char userinput[100];を書くことであろう克服するためのシンプルなソリューション

... fpためNULL - 値で呼び出されます。それ以外の場合はptr->filenameのメモリを予約し、内容をコピーするのはuserinputです。