【问题标题】:Segmentation Fault with Pointers and Strings指针和字符串的分段错误
【发布时间】:2014-04-19 04:02:02
【问题描述】:

我正在编写 C 函数 strcat 的指针版本。它将字符串 t 复制到 s 的末尾。这是我的解决方案:

/* strcat: a pointer version of the strcat (copy string t to the end of s) */
void strcat (char *s, char *t)
{
    while (*s++ != '\0')    /* find the end of s */
        ;

    while (*s++ = *t++)
    ;
}

我运行它但它崩溃了 - 代码块调试器称它为分段错误,并且这部分函数导致了崩溃:

while (*s++ = *t++)

我做错了什么?

【问题讨论】:

  • ==而不是=
  • 你是怎么称呼你的strcat()的?
  • 你分配了足够的内存吗?如果您显示更多代码,将会很有帮助。
  • 顺便说一句,你的实现有一个逻辑缺陷,在第一个while循环之后,s将指向第一个字符串的\0之后的字符,你需要添加s--; 在进入第二个 while 循环之前。
  • 编写一个与标准函数同名的函数是未定义的行为(或者实际上任何名称以str 开头,后跟一个小写字母)。您应该将其称为其他名称,例如 my_strcat。问题的另一个可能原因是,如果您实际上没有传入具有足够s 可写空间的缓冲区。请发布崩溃的整个程序。

标签: c string pointers segmentation-fault


【解决方案1】:

这是固定版本和测试程序:

#include <stdio.h>

void strcat (char *s, char *t)
{
    while (*s++) 
        ;

    s--;

    while (*s++ = *t++)
        ;
}

int
main(void)
{
    char str1[100] = "abc";
    char *str2 = "def";
    strcat(str1, str2);
    printf("%s\n", str1);
    return 0;
}

如果您按以下方式调用 strcat()

char *str1 = "abc";
char *str2 = "def";
strcat(str1, str2);

那么你的程序可能会崩溃,因为编译器通常会将字符串文字放在只读内存区域,尝试写入这些地方会导致段错误。

【讨论】:

  • 嘿,谢谢。我确实尝试使用这两个定义调用 strcat 。现在说得通了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
相关资源
最近更新 更多