strcpy导致程序收到信号SIGSEGV,分段错误

时间:2017-10-27 14:08:29

标签: c++ gdb strcpy

我有以下代码:

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 个答案:

答案 0 :(得分:0)

假设您出于某种原因使用C风格的字符串 - 如果没有,请使用std :: string作为上面建议的@manni66。

您正在声明变量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;
}

答案 1 :(得分:0)

基本问题是strcpy不分配任何内存,它只是从一个地方复制到另一个地方,并假设在目的地位置分配了足够的空间。

您需要在SourceWeightFiel和TargetWeightFile中分配足够的空间。

甚至更好,使用strdup。

如前所述,std :: string也会简化问题。

答案 2 :(得分:0)

另一种解决方案:

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

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

 return 1;
}