【问题标题】:Segmentation fault (core dumped) while performing strcat using pointers使用指针执行 strcat 时出现分段错误(核心转储)
【发布时间】:2014-06-09 10:29:45
【问题描述】:

我对 C 比较陌生。现在我知道当我们尝试使用我们无权访问的内存时会出现分段错误。但我找不到我哪里出错了,我想知道。任何帮助,将不胜感激。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str1 = "United";
char *str2 = "Front";
char *str3;

int l1,l2,l3;
l1 = strlen(str1)+1;
l2 = strlen(str2)+1;
l3 = l1 + l2; 

str3 = (char *)malloc(l3);
str3 = strcat(str1,str2);

printf("%s\n",str3);

return 0;
}

【问题讨论】:

    标签: c segmentation-fault malloc coredump c-strings


    【解决方案1】:
    str3 = strcat(str1,str2);
    

    str1 指向一个字符串文字,你不能连接(修改)它。这会导致undefined behaviour

    strcpy(str3,str1);
    strcat(str3,str2);
    

    您必须确保为str3 分配了足够的内存。

    还有,

    投射malloc return could be dangerous

    使用main() 的标准原型,例如:int main(void)int main(int argc, char*argv[])

    【讨论】:

    • 谢谢,请注意!但是,strcpy(str3,str1);strcpy(str3,str2); 将输出作为 Front,我如何使用指针连接(输出:UnitedFront)?
    • 第二个应该是strcat 而不是strcpy 来连接它们
    • @Doraj 谢谢。通常的复制粘贴错误:)
    • 是的,我太清楚了:)
    【解决方案2】:
    char *str1 = "United";
    char *str2 = "Front";
    

    将字符串放置在内存的只读部分,并使*str1*str2成为指向它的指针,从而使对该内存的任何写入操作都是非法的。

    所以在这里你尝试将*str2 指向的字符串连接到*str1,这会导致未定义的行为。

    改为str3 = strcat(str1,str2);

    你可以这样做

    strcpy(str3,str1);
    strcpy(str3+strlen(str3),str2);
    

    相反

    【讨论】:

    • +1。严格来说,字符串文字不需要存储在只读内存中。 C标准说修改它是UB。没有 MMU 的系统很乐意允许它。可以(有效)在准标准 C 中修改它:)
    • @BlueMoon 感谢您的澄清,我已经给了你 +1 :)。
    【解决方案3】:

    下面的代码应该可以工作:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
      char *str1 ;
      char *str2 ;
      char *str3;
      int l1,l2,l3;
      str1  = (char*)malloc(10);
      str2  = (char*)malloc(10);
      strcpy(str1,"United" );
      strcpy(str2,"Front" );
    
      l1 = strlen(str1)+1;
      l2 = strlen(str2)+1;
    
      l3 = l1 + l2; 
    
    
      str3 = (char *)malloc(l3);
      str3 = strcat(str1,str2);
    
      printf("%s\n",str3);
    
      return 0;
    }
    

    【讨论】:

    • 是的!谢谢:D
    【解决方案4】:

    有一个大小为 (str1 + str2 + 1) 的缓冲区 (str3)。

    使用 memcpy 获取所需内容。

    memcpy(str3, str1, 6);
    memcpy( str3 + 6, str2, 5 );
    

    在字符串末尾添加一个空 ('\0') 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 2015-05-12
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      相关资源
      最近更新 更多