【问题标题】:when strdup function fails?当 strdup 函数失败时?
【发布时间】:2012-03-29 14:44:38
【问题描述】:

我有以下使用 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函数失败?

【问题讨论】:

  • 小心你使用_strdup而不是strdup,我不确定你知道为什么。
  • 编译器给了我警告
  • @dato:编译器给了你一个关于_strdupstrdup的警告? strdup 函数未由 C 标准定义。它由 POSIX 定义。你可能需要做一些事情来让你的编译器识别它,比如#defineing 一些符号。使用_strdup 而不是strdup 不是一个好的解决方案。
  • Warning 1 警告 C4996:'strdup':不推荐使用此项目的 POSIX 名称。而是使用符合 ISO C++ 的名称:_strdup。详细信息请参见在线帮助。 c:\文档和设置\学生\我的文档\visual studio 2008\projects\strdup_function\strdup_function\strdup_function.cpp 8 strdup_function

标签: c string strdup


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    strdup 失败的机会取决于malloc 失败的机会。在具有虚拟内存的现代操作系统上,malloc 故障是非常罕见的事情。在系统内存不足以至于malloc 必须返回NULL 之前,操作系统甚至可能已经杀死了您的整个进程。

    【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多