繁体   English   中英

strcpy 原因程序收到信号SIGSEGV,分段错误

[英]strcpy cause Program received signal SIGSEGV, Segmentation fault

我有以下代码:

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)

我不知道为什么,也不知道如何解决它。 有人知道吗?

假设您出于某种原因使用 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;
}

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

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

或者甚至更好,使用 strdup。

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

另一种解决方案:

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

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

 return 1;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM