2017-10-27 16 views
-5

私は以下のコードを持っている:strcpyの原因プログラムは、信号SIGSEGV、セグメンテーションフォールトを受け

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

    char* SourceWeightFiel; 

    char* TargetWeightFile; 

    strcpy(SourceWeightFiel, argv[1]); 

    strcpy(TargetWeightFile, argv[2]); 

return 1; 
} 

私はGDBでそれをデバッグするとき、それは最初のstrcpyを実行しているで大丈夫ですが、それは第二のstrcpyになると、それを

26  strcpy(SourceWeightFiel, argv[1]); 
(gdb) n  
27  strcpy(TargetWeightFile, args);  
(gdb) n 

Program received signal SIGSEGV, Segmentation fault.  
__strcpy_sse2_unaligned() 
    at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:94  
94 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or directory.  
(gdb) 

私は理由を理解できず、それを修正する方法がわかりません。誰もそれについて知っていますか?

+3

これらのステートメントのstrcpy(SourceWeightFiel、ARGV [1])。 strcpy(TargetWeightFile、argv [2]);ポインタが初期化されていないため意味がなく、未定義の動作をしません。不確定な値を持っています –

+0

これはC++です。 std :: stringではなくstrcpyを使用します。 –

+0

argv [1]またはargv [2]が存在するかどうかはテストしません。 –

答えて

0

あなたが理由でCスタイルの文字列を使用していると仮定すると - 、ちょうど@ manni66上記の提案としてのstd ::文字列を使用しない場合。

変数SourceWeightFielTargetWeightFielを宣言していますが、コピーするスペースは割り当てられていません。 malloc()(またはこれに類するもの)で自分で行うことも、使用することもできます。strdup()

完了したら、その割り当てられたスペースを自由に使用することを忘れないでください。

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

    char* SourceWeightFiel; 
    char* TargetWeightFile; 

    SourceWeightFiel = strdup (argv[1]); 
    TargetWeightFile = strdup (argv[2]); 

    /* After you've used them... */ 

    free (TargetWeightFile); 
    free (SourceWeightFiel); 
    return 1; 
} 
+0

それはCの良いアドバイスです。 –

0

根本的な問題は、strcpyのは、ある場所から別の場所へ任意のメモリ、それだけのコピーを割り当てて、十分なスペースが宛先の場所に割り当てられていることを前提としていないということです。

SourceWeightFielとTargetWeightFileに十分な領域を割り当てる必要があります。

さらに、strdupを使用してください。

既に述べたように、std :: stringは問題を簡素化します。

0

別の解決策:

int main(int argc,char * argv[]) 
{ 
    char SourceWeightFiel[256]=""; 
    char TargetWeightFile[256]=""; 

    strcpy(SourceWeightFiel, argv[1]); 
    strcpy(TargetWeightFile, argv[2]); 

return 1; 
} 
関連する問題