strcat失败的可能性?

时间:2010-01-12 15:57:18

标签: c

strcat是否有可能失败?

如果我们传递了一些不正确的缓冲区或字符串,那么它可能会导致内存损坏。但是,除此之外,即使传递的目标字符串是非NULL,此函数也可能返回失败,就像strcat返回NULL一样?如果不是,为什么strcat具有指定的返回类型?

我刚才提到过strcat作为例子。但是,这个问题适用于许多字符串和内存相关(如memcpy等)函数。我只是想知道其中一些看似“总是成功”的函数背后的原因有返回类型。

5 个答案:

答案 0 :(得分:9)

返回指向目标字符串的指针可以很容易地以这种(可能不那么聪明)的方式使用输出:

int len = strlen(strcat(firstString, secondString));

答案 1 :(得分:3)

他们中的大多数都回到了C不包含'void'的时候,所以无法指定它没有返回值。结果,他们指定他们返回某些东西,即使它是无用的。

答案 2 :(得分:2)

这些函数的隐式契约如下:如果传入指向有效字符串的指针,那么函数将按照公布的方式执行。传入一个NULL指针,该函数可以做任何事情(通常,它会引发一个SIGSEGV)。鉴于参数有效(即指向字符串),所使用的算法不会失败。

答案 3 :(得分:1)

我总是忽略返回类型(想知道是谁使用它们)直到今天我在glibc-2.11中看到了这一点(完全从源文件中复制)并且一切都变得更加清晰:

wchar_t *
wcsdup (s)
     const wchar_t *s;
{
  size_t len = (__wcslen (s) + 1) * sizeof (wchar_t);
  void *new = malloc (len);

  if (new == NULL)
    return NULL;

  return (wchar_t *) memcpy (new, (void *) s, len);
}

这样可以更容易地编写更少的代码(“链”吗?)我想。

答案 4 :(得分:1)

以下是来自OpenBSD的strcat的非常标准的实现:

char *
strcat(char *s, const char *append)
{
        char *save = s;

        for (; *s; ++s);
        while ((*s++ = *append++) != '\0');
        return(save);
}

只要传递给它的输入有效(即append被正确终止并且s足够大以连接它),这就不会真正失败 - 这是一个简单的内存操作。该记忆完全在来电者的控制之下。

此处的返回值可用于链接连接,例如:

strcat(strcat(s, t1), t2);

虽然这很难有效......