strcat失败的可能性?
strcat有可能失败吗 如果传递的缓冲区或字符串不正确,则可能导致内存损坏。但是,除此之外,即使传递的目标字符串为非NULL,该函数是否可能返回类似strcat返回NULL的失败?如果否,为什么strcat有一个指定的返回类型strcat失败的可能性?,c,C,strcat有可能失败吗 如果传递的缓冲区或字符串不正确,则可能导致内存损坏。但是,除此之外,即使传递的目标字符串为非NULL,该函数是否可能返回类似strcat返回NULL的失败?如果否,为什么strcat有一个指定的返回类型 我刚才提到strcat作为一个例子。但是,这个问题适用于许多与字符串和内存相关的函数(如memcpy等)。我只想知道这些看似“总是成功”的函数中有返回类型的原因。它们中的大多数都可以追溯到C不包含“void”的时代,因此无法指定它没有返回值。因此,他们指定它们返回某个东
我刚才提到strcat作为一个例子。但是,这个问题适用于许多与字符串和内存相关的函数(如memcpy等)。我只想知道这些看似“总是成功”的函数中有返回类型的原因。它们中的大多数都可以追溯到C不包含“void”的时代,因此无法指定它没有返回值。因此,他们指定它们返回某个东西,即使它非常无用。大多数都可以追溯到C不包含“void”的时代,因此无法指定它没有返回值。因此,他们指定它们返回某些内容,即使它非常无用。返回指向目标字符串的指针可以很容易地以这种方式(也许不是那么聪明)使用输出:
返回一个指向目标字符串的指针可以很容易地以这种方式(也许不是那么聪明)使用输出:
这些函数的隐式约定如下:如果您传入指向有效字符串的指针,则函数将按照公布的方式执行。传入一个空指针,该函数可以执行任何操作(通常,它会引发SIGSEGV)。如果参数有效(即指向字符串),则使用的算法不会失败。这些函数的隐式约定如下:如果您传入指向有效字符串的指针,则函数将按照公布的方式执行。传入一个空指针,该函数可以执行任何操作(通常,它会引发SIGSEGV)。假设参数是有效的(即指向字符串),那么使用的算法就不会失败。我一直忽略返回类型(不知道是谁使用它们),直到今天我在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);
}
这使得编写更少的代码变得更容易(“链”它?)。我一直忽略返回类型(不知道是谁使用它们),直到今天我在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);
}
这使得编写更少的代码变得更容易(“链”它?)。这是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);
虽然这很难有效…这里是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);
虽然这很难有效…也
strcat(strcat(第一、第二、第三)代码>也strcat(strcat(第一、第二、第三)代码>。顺便说一句,我希望strcat返回一个指向结果字符串结尾的指针,这更有用。我不明白为什么您将“具有返回类型”等同于“可能失败”。strcat()返回指向结果字符串的指针。这不是一个成功的代码,它只是指定的返回值。顺便说一句,我希望strcat
返回一个指向结果字符串结尾的指针,这更有用。我不明白为什么您将“具有返回类型”等同于“可能失败”。strcat()返回指向结果字符串的指针。这不是成功代码,只是指定的返回值。