0

我有以下使用 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;
}

它成功地显示了源字符串,但我很感兴趣它在哪种情况下失败以及它在日常问题中的使用效果如何?我知道它是由 strdup 决定的

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
}

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

4

3 回答 3

4

是的,如果malloc分配内存失败并返回NULL.

当您尝试复制非常大的字符串时,或者如果您的地址空间非常分散且几乎已满(因此malloc无法找到要分配的连续内存块,或者在内存不多的嵌入式系统中,这可能会合理地发生可用。

于 2012-03-29T14:45:46.100 回答
1

失败的机会strdup是由失败的机会决定的malloc。在具有虚拟内存的现代操作系统上,malloc失败是非常罕见的事情。操作系统甚至可能在系统内存不足而malloc不得不返回之前杀死了您的整个进程NULL

于 2012-03-29T14:47:29.900 回答
1

如果存在内存泄漏,内存不足的情况并非闻所未闻。因此,检查空值、打印出错误消息,甚至可能在此时退出并不是一个坏主意。请注意,如果您的内存不足,诸如“printf”之类的东西将不起作用(或者可能不起作用,但根据我的经验,不起作用)。因此,您必须使用低级别的“写入”等,并且您正在使用的文件描述符(如果您正在写入日志文件)应该已经打开。

于 2012-03-29T14:59:04.810 回答