strdup・とは?初心者向けに解説するC言語の文字列複製共起語・同意語・対義語も併せて解説!

  • このエントリーをはてなブックマークに追加
strdup・とは?初心者向けに解説するC言語の文字列複製共起語・同意語・対義語も併せて解説!
この記事を書いた人

高岡智則

年齢:33歳 性別:男性 職業:Webディレクター(兼ライティング・SNS運用担当) 居住地:東京都杉並区・永福町の1LDKマンション 出身地:神奈川県川崎市 身長:176cm 体系:細身〜普通(最近ちょっとお腹が気になる) 血液型:A型 誕生日:1992年11月20日 最終学歴:明治大学・情報コミュニケーション学部卒 通勤:京王井の頭線で渋谷まで(通勤20分) 家族構成:一人暮らし、実家には両親と2歳下の妹 恋愛事情:独身。彼女は2年いない(本人は「忙しいだけ」と言い張る)


strdup・とは?

strdupはC言語の文字列をコピーして新しい領域へ確保する便利な関数です。与えられた文字列の内容をそのまま別の場所に複製します。コピー先の領域は動的に確保され、先頭のポインタが返されます。戻り値が NULL のときはメモリの確保に失敗したことを意味します。

この機能の強みは、元の文字列と同じ内容を持つ“独立した”文字列を作れる点です。独立して扱えるので、元の文字列を変更してもコピーには影響しません。

仕組みと使い方

プロトタイプは通常次のように宣言されます。char *strdup(const char *s);

この関数は、与えられた文字列の長さを測り、末尾のヌル文字も含めて新しい領域を malloc で確保します。その後、元の内容を新しい領域へコピーして先頭ポインタを返します。もしメモリ割り当てに失敗すると NULL が返されます。

注意点として、strdup は標準Cでは必ずしも保証されていない点があります。多くの環境では POSIX 標準の一部として提供されますが、移植性を重視する場合は自分で実装する方法を選ぶこともあります。

使い方の流れとポイント

実際の流れは次のようになります。まずコピー元の文字列を用意し、strdup を呼び出して新しい領域へコピーします。戻り値が NULL でなければ、その指す文字列を使い終わったら free で解放します。最後にポインタを NULL にしておくと二度目の解放ミスを避けられます。

重要な点は、strdup が返すポインタは malloc で確保したメモリを指しているということです。したがって使用後は free を必ず呼ぶ必要があります。これを怠るとメモリリークの原因になります。

仕様を表で確認

項目strdup
説明与えられた文字列を新しい領域へコピーして返す
引数コピーしたい文字列の先頭ポインタ
返り値新しく確保した文字列の先頭ポインタ、失敗時は NULL
メモリ管理使用後は free で解放する

比較と代替案

strdup は便利ですが、標準Cには含まれません。POSIX 環境では提供されますが、全ての環境で使えるわけではありません。 portability を重視する場合は、自分で同等の機能を実装しておくと安心です。

自前実装のイメージは次のようになります。元の長さを測って新しい領域を確保し、元の内容をコピーして終端を付けます。実装の要点は「長さの取得」「領域確保」「コピー」「終端の設定」の4点です。

実用的な注意点

環境差により、strdup の有無が異なる点は覚えておきましょう。Windows では _strdup の名前で提供されることがあります。もし使えない場合は、自分で_strdup のような関数を用意するか、malloc と memcpy の組み合わせで再現します。


strdupの同意語

strdup
元の文字列を動的に確保した新しいメモリ領域にコピーして返す、POSIX準拠の文字列複製関数。返り値は新しいポインタ、失敗時はNULL。
文字列の複製
元の文字列と同じ内容を、別のメモリ領域にコピーして新たな文字列を作る一般的な表現
新規メモリ領域へ文字列をコピーして返す関数
元文字列を新規に確保したメモリ領域にコピーし、ポインタを返す機能を指す表現
動的メモリ割り当て付き文字列複製
malloc などで動的にメモリを確保して文字列を複製する機能を表す語
メモリ確保付き文字列複製
新規メモリを確保して文字列を複製することを強調した表現
POSIXの文字列複製関数
POSIX 標準で定義されている文字列を複製する機能の総称
文字列コピー関数(メモリ確保付き)
文字列をコピーするとともに新規メモリを確保するタイプの関数を指す表現
文字列を別の領域にコピーして返す関数
元の文字列を別の領域へコピーして新しい文字列を返す機能を示す表現
strdupと同等の機能を持つ関数
strdupと同じ機能を提供する関数を指す説明

strdupの対義語・反対語

free
strdup が新しく確保したメモリを解放する操作を指す対義語。strdup は元の文字列をコピーして新規のメモリ領域を作りますが、free はその確保した領域を解放して再利用可能にします。
deallocate
メモリの割り当てを解除する一般的な語。strdup がメモリを確保してコピーするのに対し、deallocate は割り当てを取り消す意味を表します。
release
ソースを解放する意味の語。strdup の対義語として、コピーしたリソースを手放すニュアンスを伝えます。
destroy
データ構造を破棄して解放する意味。strdup が新しい文字列のコピーを作るのに対し、destroy は既存データを完全に壊して解放するニュアンスです。
delete
確保したメモリを削除・破棄する動作。C++ の delete 操作に相当する語で、割り当て済みメモリを解放します。
解放
メモリの割り当てを返却して解放する意の日本語語。strdup が新しく領域を確保してコピーするのに対し、解放はその領域を返却して再利用可能にします。

strdupの共起語

malloc
動的メモリをヒープ上に確保するC標準ライブラリ関数。strdupは内部で malloc を使い、新しい領域を確保して元の文字列をコピーします。
free
strdup で確保した領域を解放する関数。使用後は free でメモリを解放するのが基本です。
strlen
文字列の長さを取得する関数。strdup の実装でコピー長を決定する際に使われることがあります。
strcpy
文字列を別の領域へコピーする関数。strdup の実装でコピー処理に使われることがある。
NULL
メモリ確保失敗時に返されるポインタの特別な値。コピーに失敗した場合の返り値として使われます。
string.h
strdup の宣言が含まれるヘッダファイル。#include が必要です。
POSIX
strdup は POSIX 標準で定義されている関数。UNIX系の環境で広く提供されます。
_strdup
Windows の同等機能で、MSVC などのCランタイムで利用される関数名です。
strndup
最大長さまでの複製を行う安全な代替関数。コピー長を制御できます。
size_t
長さやサイズを表す非負整数型。strdup の割り当てサイズや返り値の型として使われます。
char
文字を格納する基本型。strdup は char 配列(文字列)を扱います。
const_char_pointer
引数は const char* で渡され、元の文字列は変更されません。
heap
動的メモリ領域のこと。strdup はヒープ上に新しい文字列を確保します。
null_terminated_string
ヌル終端(終端文字が0x00)で終わる C 文字列のこと。strdup はこの終端を含めてコピーします。
ENOMEM
メモリ確保に失敗したときに設定される errno の値の1つ。
errno
エラー番号を格納するグローバル変数。strdup が失敗した場合に参照されることがあります。
memory_allocation
動的メモリ割り当ての概念。strdup はこのプロセスに依存します。
deep_copy
元の文字列の内容を新しい領域へ完全にコピーして独立させること。strdup は深いコピーに相当します。
C_standard_library
C 言語の標準ライブラリ。strdup はPOSIX由来ですが、多くの実装で提供されます。
time_complexity
文字列長に比例して処理時間がかかる O(n) の時間複雑度です。
memcpy
メモリブロックを高速にコピーする関数。strdup の内部コピーにも使われることがあります。

strdupの関連用語

strdup
文字列を複製するためのCライブラリ関数。元の文字列へのポインタを受け取り、ヒープ上に新しい領域を確保して内容をコピーしたうえで先頭ポインタを返します。返り値は char*、失敗時は NULL。確保したメモリは free で解放します。引数が NULL の場合は未定義動作になることがあります。strdup は POSIX 標準に含まれることが多いですが、ISO C 標準には必ずしも含まれません。
malloc
ヒープ上に任意のサイズの未初期化メモリを確保する関数。引数は確保するバイト数 size。返り値は void*、確保できなかった場合は NULL。使用後は free で解放します。
free
malloc などで確保したメモリを解放する関数。free(NULL) は安全。二度以上の解放は未定義動作になるため避けます。
calloc
要素数とサイズを掛け合わせた分のメモリを確保し、すべてゼロ初期化して返します。返り値は void*、失敗時は NULL。
realloc
既存のメモリブロックのサイズを変更する関数。新しい領域へ移動することがあり、成功時は新しいポインタを返します。失敗時は NULL を返すが、元のブロックは解放されていないので注意。
strndup
strdup に似ていますが、元の文字列からコピーする最大文字数を n で制限します。コピー後は必ず終端の NUL 文字をつけて返します。失敗時は NULL。
strlen
文字列の長さを返します。終端の NUL は数えません。戻り値は size_t。入力が NULL の場合は未定義です。
strcpy
ソース文字列をデスティネーションへ NUL 文字も含めてコピーします。デスティネーションのバッファサイズが十分である必要があり、サイズ不足はバッファオーバーフローの原因になります。
strncpy
最大 n 文字までコピーします。src が小さい場合はデスティネーションを NUL 埋めしますが、src の長さが n 以上だと結果が NUL で終端されない場合があり、安全性は難しいです。
strcat
デスティネーション文字列の末尾にソース文字列を追加します。デスティネーションのバッファが十分に確保されている必要があります。
strncat
デスティネーションの末尾に maxn 文字まで追加します。追加後には必ず NUL terminator が置かれます。
memcpy
バイト単位でメモリ領域をコピーします。コピー元とコピー先の領域が重なる場合は未定義動作になることがあるため、重なりがある場合は memmove を使うべきです。
memmove
memcpy と似ていますが、コピー元とコピー先が重なる場合でも正しく動作します。
asprintf
フォーマット済み文字列を動的に確保して返す GNU 拡張。返り値は生成された文字列の先頭ポインタ。失敗時は NULL。
_strdup
Microsoft のコンパイラで提供される strdup の互換名。基本的には strdup と同じ挙動です。
wcsdup
ワイド文字列を複製する関数。引数は wchar_t* のポインタ。ヒープ領域を確保してコピーします。
strlcpy
安全な文字列コピーの代替として BSD 系などで提供される関数。デスティネーションのサイズを超えないようにコピーし、NUL terminator を確実に付けます。標準ではないことが多いので移植性を確認します。
strlcat
strlcat は strlcpy と同様に安全に末尾連結を行う関数。デスティネーションのバッファサイズを超えないようにコピーします。標準ではないことが多いです。
NULL
ポインタが何も指していない状態を表す特別な値。strdup などの関数が失敗したときには NULL が返ることがあります。呼び出し元は必ず NULL チェックをしてから解放やアクセスをします。
POSIX
strdup は POSIX 規格に含まれることがある関数です。POSIX にはメモリ管理や文字列操作の標準が定義されています。
C標準ライブラリ
strdup は ISO C 標準には必ずしも含まれません。移植性を考慮して実装環境のドキュメントを確認しましょう。
バッファオーバーフロー
コピー系関数を使う際、デスティネーションの容量を超えると外部からの書き込みが発生し、プログラムが不正動作したりセキュリティホールになったりします。
メモリリーク
確保したメモリを解放せずに使い続けると、アプリが徐々にメモリを消費していく現象。strdup で確保したメモリは必ず free で解放します。

インターネット・コンピュータの人気記事

awstatsとは?初心者でもわかる使い方と基本解説共起語・同意語・対義語も併せて解説!
14202viws
bing・とは?初心者のための基本ガイド:検索エンジンの仕組みと使い方共起語・同意語・対義語も併せて解説!
2135viws
着信転送とは?初心者向けガイドで分かる使い方と設定のコツ共起語・同意語・対義語も併せて解説!
1036viws
リマインドメールとは?初心者にもわかる基本ガイドと使い方のコツ共起語・同意語・対義語も併せて解説!
738viws
充電アダプターとは何かを徹底解説|初心者でも分かる基本と選び方のコツ共起語・同意語・対義語も併せて解説!
682viws
com端子・とは?初心者にも分かる基礎ガイド|シリアルポートの使い方と歴史を解説共起語・同意語・対義語も併せて解説!
655viws
pinロックとは?初心者が知っておくべき基本と使い方ガイド共起語・同意語・対義語も併せて解説!
567viws
16進数カラーコード・とは?初心者でもつまずかない基礎と使い方ガイド共起語・同意語・対義語も併せて解説!
518viws
asp・とは?初心者向けに徹底解説する基本と使い方ガイド共起語・同意語・対義語も併せて解説!
494viws
7zファイル・とは?初心者でもわかる使い方と特徴を解説共起語・同意語・対義語も併せて解説!
493viws
ローカルポート・とは?初心者にも分かる基本と使い方ガイド共起語・同意語・対義語も併せて解説!
463viws
差し込み印刷・とは?初心者でもすぐわかる使い方と仕組みガイド共起語・同意語・対義語も併せて解説!
449viws
全角文字とは?初心者向け解説|全角と半角の違いをやさしく学ぶ共起語・同意語・対義語も併せて解説!
425viws
none とは?初心者にもやさしく解説する意味と使い方ガイド共起語・同意語・対義語も併せて解説!
383viws
ワンタイムコード・とは?初心者でも分かる基本と使い方ガイド共起語・同意語・対義語も併せて解説!
381viws
select句・とは?初心者でも分かるSQLの基本と使い方共起語・同意語・対義語も併せて解説!
367viws
csvダウンロードとは?初心者が今すぐ使える基本ガイド共起語・同意語・対義語も併せて解説!
347viws
ダイレクトチャットとは?初心者向けガイドで使い方と注意点を徹底解説共起語・同意語・対義語も併せて解説!
330viws
解像度スケールとは?初心者でも分かる解像度スケールの基礎と使い方共起語・同意語・対義語も併せて解説!
279viws
sha256とは?初心者が知るべき暗号ハッシュの基礎と使い道共起語・同意語・対義語も併せて解説!
279viws

新着記事

インターネット・コンピュータの関連記事