如何在实现strcat时删除分段错误(核心转储)错误?

时间:2016-09-19 02:42:11

标签: c string pointers

9我正在学习K& R的指针。我试图实现strcat(ubuntu,gcc)。代码正在编译但是当我运行它时,我得到分段错误错误。我在网上搜索了它,但我所能知道的是我正在尝试访问我不应该或不允许访问的内存位置。但是,我在代码中找不到错误。

#include <stdio.h>

void xstrcat(char *s, char *t);

int main(void) {
    char *s = "hel";
    char *t = "lo.";
    xstrcat(s, t);
    printf("%s",s);
    return 0;
}

void xstrcat(char *s, char *t) {
    while(*s)
            s++;
    while(*s++ = *t++)
            ;
}

请告诉我错误究竟在哪里?为什么?

3 个答案:

答案 0 :(得分:0)

你实际上遇到了一些问题。您将字符串st定义为字符串文字。在大多数实现中,字符串文字是只读的,不能修改;试图这样做是未定义的行为。见this question。相反,您应该像这样定义变量:

char s[] = "hel";
char t[] = "lo.";

然而,这仍然无法解决您的问题。 s为其分配了4个字节(3个字母和NULL终结符)。写入超出此长度的数据是未定义的行为。如果要将数据附加到s,则需要使用适合串联的大小来声明数据。

char s[32] = "hel";  // now there is enough space to concatenate "lo." to the end
char t[] = "lo.";

答案 1 :(得分:0)

理解char s1[] = "string";char* s2 = "string"并不完全相同,即使C中的指针和数组之间存在紧密关联.s1是一个字符数组,s2是指向文字字符串的指针可以存储在可执行文件的只读部分中。修改s2内容将导致程序崩溃。

参见C FAQ 1.32项目:

答案 2 :(得分:0)

问题不在于xstrcat(),而在于您传递的数据。只有第一个参数存在争议,因为第二个参数未被修改,应在函数声明中标记为(const)。程序员负责确保第一个参数可以被修改并且在其中有足够的额外空间来包含连接到它上面的任何内容:

#include <stdio.h>

void xstrcat(char *s, const char *t);

int main(void) {
    char s[1024] = "hel";
    char *t = "lo.";
    xstrcat(s, t);
    printf("%s\n", s);
    return 0;
}

void xstrcat(char *s, const char *t) {
    while (*s != '\0') {
        s++;
    }

    while ((*s++ = *t++) != '\0') {
        /* pass */
        }
}

如果您在尝试重新实现之前阅读了strcat() man 页面,您会看到这一点。您还会看到以下内容:

  

strcat()函数很容易以一种启用的方式被滥用   恶意用户随意改变正在运行的程序   通过缓冲区溢出攻击的功能。

     

避免使用strcat()。相反,使用strncat()

相反,作为一种更好的练习,您可以实施xstrncat()