【问题标题】:strcpy cause Program received signal SIGSEGV, Segmentation faultstrcpy 原因 程序收到信号 SIGSEGV,分段错误
【发布时间】:2018-04-09 04:13:25
【问题描述】:

我有以下代码:

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)

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

【问题讨论】:

  • 这些语句 strcpy( SourceWeightFiel, argv[1] ); strcpy(TargetWeightFile, argv[2]);没有意义并且具有未定义的行为,因为指针未初始化并且fd具有不确定的值
  • 它是 C++。使用 std::string 而不是 strcpy。
  • 您不测试 argv[1] 或 argv[2] 是否存在。

标签: c++ gdb strcpy


【解决方案1】:

假设您使用 C 风格的字符串是有原因的 - 如果不是,请按照上面的 @manni66 建议使用 std::string。

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

【讨论】:

    【解决方案2】:

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

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

    或者更好的是,使用 strdup。

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

    【讨论】:

      【解决方案3】:

      另一种解决方案:

      int main(int argc,char * argv[] )
      {
        char SourceWeightFiel[256]="";
        char TargetWeightFile[256]="";
      
        strcpy( SourceWeightFiel, argv[1] );
        strcpy( TargetWeightFile, argv[2] );
      
       return 1;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多