C 当strdup函数失败时?

C 当strdup函数失败时?,c,string,strdup,C,String,Strdup,我有以下使用strdup函数的代码 #include<stdlib.h> #include<stdio.h> #include<string.h> char source[] = "The Source String "; int main() { char *dest; if ((dest = _strdup(source)) == NULL) { fprintf(stderr, " Error allocation memory.

我有以下使用strdup函数的代码

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

char source[] = "The Source String ";

int main()
{
  char *dest;
  if ((dest = _strdup(source)) == NULL)
  {
    fprintf(stderr, " Error allocation memory. ");
    exit(1);
  }
  printf("The destination = %s\n", dest);
  return 0;
}

如果字符串不为NULL,是否有可能导致strdup函数失败?

是,如果
malloc
无法分配内存并返回
NULL


当您试图复制一个非常大的字符串时,或者如果您的地址空间非常零碎且几乎已满,则可能会发生这种情况(因此,taht
malloc
无法找到要分配的连续内存块,或者在内存不足的嵌入式系统中。

是,如果
malloc
无法分配内存并返回
NULL


当您试图复制一个非常大的字符串时,或者如果您的地址空间非常零碎且几乎已满,则可能会发生这种情况(因此,在内存不足的嵌入式系统中,
malloc
找不到可分配的连续内存块。

strdup失败的几率取决于
malloc
失败的几率。在具有虚拟内存的现代操作系统中,
malloc
失败是非常罕见的事情。操作系统甚至可能在系统内存不足时终止了您的整个进程,
malloc
必须返回
NULL
strdup失败的几率取决于
malloc
失败的几率。在具有虚拟内存的现代操作系统上,
malloc
失败是非常罕见的操作系统甚至可能在系统内存不足之前杀死了你的整个进程,
malloc
必须返回
NULL

如果出现内存泄漏,那么内存不足也并非闻所未闻。 所以,检查null,打印错误消息,甚至在该点退出都不是一个坏主意。
请注意,如果内存不足,“printf”之类的东西将不起作用(或者可能不起作用,但以我的经验来看是不起作用的)。因此,您必须使用低级别的“write”之类的东西,并且您正在使用的文件描述符(如果您正在写入日志文件)应该已经被打开。

如果内存泄漏,内存不足也不是闻所未闻的。 所以,检查null,打印错误消息,甚至在该点退出都不是一个坏主意。
请注意,如果内存不足,“printf”之类的东西将不起作用(或者可能不起作用,但以我的经验来看是不起作用的)。因此,您必须使用低级“write”之类的东西,以及您正在使用的文件描述符(如果您正在写入日志文件),应该已经打开。

请小心使用
\u strdup
而不是
strdup
,我不确定您是否知道原因。编译器警告我it@dato:编译器向您发出了关于
\strdup
或关于
strdup
的警告。
strdup
函数不是由C标准定义的。它是由POSIX。你可能需要做一些事情来让你的编译器识别它,比如< C++ >定义< /代码> ING一些符号。使用<代码>“SydUp 而不是<代码> StutUp>代码>不是一个好的解决方案。警告1警告C499::“STRUP”:这个项目的POSIX名称被弃用。r details.c:\documents and settings\student\my documents\visual studio 2008\projects\strdup\u function\strdup\u function.cpp 8 strdup\u function小心使用
\strdup
而不是
strdup
,我不确定您是否知道原因。编译器警告我it@dato:编译器向您发出了关于
\strdup的警告
,或关于
strdup
?C标准没有定义
strdup
函数。它是由POSIX定义的。您可能需要做一些事情让编译器识别它,例如
#定义一些符号。使用
\strdup
而不是
strdup
不是一个好的解决方案。警告1警告C4996:这个项目的POSIX名称被弃用。相反,使用ISOC++的名称:yStrudUp。参见详细信息的在线帮助。C:\文档和设置\\学生\文档\ VisualStudio 2008 \项目\ StrudUpStudio \ StrudUpFuff\StrudUpFuff.CPP 8 StrudUpFor功能更糟,OS可能或更糟,OS可能。
char *strdup (const char *s)
{
    char *d = malloc (strlen (s) + 1);   // Space for length plus nul
    if (d == NULL) return NULL;          // No memory
    strcpy (d,s);                        // Copy the characters
    return d;                            // Return the new string
}