strcat是否有可能失败?
如果我们传递了一些不正确的缓冲区或字符串,那么它可能会导致内存损坏。但是,除此之外,即使传递的目标字符串是非NULL,此函数也可能返回失败,就像strcat返回NULL一样?如果不是,为什么strcat具有指定的返回类型?
我刚才提到过strcat作为例子。但是,这个问题适用于许多字符串和内存相关(如memcpy等)函数。我只是想知道其中一些看似“总是成功”的函数背后的原因有返回类型。
答案 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);
虽然这很难有效......