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

メモリリークが発生した場合、メモリが不足することは前例のないことではありません。したがって、nullをチェックし、エラーメッセージを出力し、その時点で終了することも悪い考えではありません。メモリが不足すると、「printf」のようなものは機能しない(または機能しないかもしれませんが、私の経験では機能しない)ことに注意してください。したがって、低レベルの「書き込み」などを使用する必要があります。使用しているファイル記述子(ログファイルに書き込みをしている場合)は、すでに開いている必要があります。

于 2012-03-29T14:59:04.810 に答える
1

失敗する可能性は、失敗strdupする可能性によって決まりmallocます。仮想メモリを備えた最新のオペレーティング システムでは、malloc障害は非常にまれです。mallocシステムのメモリが少なくなり、NULL.

于 2012-03-29T14:47:29.900 に答える