在字符串连接中导致此分段错误的原因是什么?

时间:2016-06-28 20:28:39

标签: c string string-literals strcat

我正在用C练习,让自己了解这个话题。我正在尝试使用我的程序来操作头文件;但程序返回"分段错误"。我已将问题隔离到以下代码段。任何人都可以帮我看看它到底出了什么问题吗?

    header=strtok(st,"\"");
    header=strtok(NULL,"\"");
    f=fopen(header,"r");
    if(f)
    {
            while((ch=fgetc(f))!=EOF)
            fputc(ch,f2);

            fclose(f);
    }
    else
    {
            header2=(char *)malloc(strlen("/usr/include")+strlen(header));
            header2=strcat("/usr/include/",header);
            f=fopen(header2,"r");

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

            while((ch=fgetc(f))!=EOF)
            fputc(ch,f2);

            fclose(f);
   }

我注意到只有在我尝试访问/ usr / include / location时才会出现此问题。某种身份验证问题?如果是这样,怎么过来呢?提前致谢。 :)

2 个答案:

答案 0 :(得分:3)

您不能将字符串文字用作strcat的目标 - 字符串文字不可修改,并且没有足够的空间来容纳连接字符串。将变量与前缀组合的更好方法是使用sprintf

header2 = malloc(strlen("/usr/include/")+strlen(header)+1);
sprintf(header2, "/usr/include/%s", header);

请注意,调用malloc()时需要在组合长度上加1,以便为尾随空字节留出空间。

您还可以使用strcpy后跟strcat

strcpy(header2, "/usr/include/");
strcat(header2, header);

答案 1 :(得分:2)

主要问题在于

header2=strcat("/usr/include/",header);

当您提供string literal作为目的地时。这没有任何空间来保存连接的字符串。因此,您实际上是在尝试访问调用undefined behavior的无效内存。

那就是说,对于strcat(),行为是,(强调我的

  

strcat()函数将src字符串附加到dest字符串,覆盖终止空字节'\0'dest,[...]

,在您的情况下,涉及尝试修改字符串文字,再次调用UB。

然后,还有更多要指出,比如