Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
strcat失败的可能性?_C - Fatal编程技术网

strcat失败的可能性?

strcat失败的可能性?,c,C,strcat有可能失败吗 如果传递的缓冲区或字符串不正确,则可能导致内存损坏。但是,除此之外,即使传递的目标字符串为非NULL,该函数是否可能返回类似strcat返回NULL的失败?如果否,为什么strcat有一个指定的返回类型 我刚才提到strcat作为一个例子。但是,这个问题适用于许多与字符串和内存相关的函数(如memcpy等)。我只想知道这些看似“总是成功”的函数中有返回类型的原因。它们中的大多数都可以追溯到C不包含“void”的时代,因此无法指定它没有返回值。因此,他们指定它们返回某个东

strcat有可能失败吗

如果传递的缓冲区或字符串不正确,则可能导致内存损坏。但是,除此之外,即使传递的目标字符串为非NULL,该函数是否可能返回类似strcat返回NULL的失败?如果否,为什么strcat有一个指定的返回类型


我刚才提到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()返回指向结果字符串的指针。这不是成功代码,只是指定的返回值。