[解決済み] memcpy(0,0,0)を実行しても安全であることが保証されているか?
質問
C言語規格にあまり詳しくないので、ご容赦ください。
規格上、保証されているのかどうか知りたいです。
memcpy(0,0,0)
が安全であることが規格で保証されているのか知りたい。
メモリ領域が重なると挙動が不定になるという制約しか見つけられませんでしたが...。
しかし、ここでメモリ領域が重なっていると考えていいのでしょうか?
どのように解決するのですか?
私は C 規格のドラフト版 (ISO/IEC 9899:1999) を持っていますが、その呼び出しについて楽しいことが書かれています。 手始めに、それは (§7.21.1/2) に関して言及しています。
memcpy
ということ
として宣言された引数が
size_t
nはある関数のための配列の長さを指定します。 として宣言された引数が関数の配列の長さを指定する場合、 nはその関数を呼び出す際に値0を持つことができます。このサブセクションの特定の関数の説明で明示的に記述されていない限り このサブセクションの特定の関数の説明の中で、他に明示されていない限り。 ポインタ引数 は、7.1.4で説明されているように、まだ有効な値を持っていなければならない。 . このような呼び出しにおいて 文字列を検索する関数は出現箇所を発見できず,2つの文字列を比較する関数はゼロを返し 文字列を比較する関数はゼロを返し,文字をコピーする関数はゼロをコピーする。 をコピーします。
ここで示された参考文献は、これを指しています。
関数の引数が無効な値である場合(たとえば 関数のドメイン外の値や、プログラムのアドレス空間外のポインタなど。 またはヌルポインタ または、対応するパラメータがconstで修飾されていない場合の変更不可のストレージへのポインタなど。 パラメータがconst-qualifiedでない場合)、または、可変長の引数を持つ関数が期待しない型(昇格後)。 で期待されない型(昇格後)です。 の場合、動作は未定義です。 .
ということは、C言語仕様によると、呼び出しは
memcpy(0, 0, 0)
の結果は、NULLポインタは"無効な値とみなされるため、未定義の動作となります。
とはいえ、もし実際に
memcpy
というのも、私が思いつく直感的な実装のほとんどは、ゼロバイトをコピーすると言った場合、まったく何もしないからです。
関連
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] "static const" vs "#define" vs "enum"
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] C言語とC++の両方で有効なコードを、それぞれの言語でコンパイルすると、異なる動作になることがありますか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] なぜ16進数には0xがつくのですか?
-
[解決済み】このC関数は常にfalseを返すべきですが、そうではありません。
-
[解決済み] memmoveはなぜmemcpyより速いのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
[C] Error [Error] 代入の左オペランドとして lvalue が必要です。
-
[解決済み] ⑭と⑯は何のためにあるのですか?
-
[解決済み] char *とchar[]の違い [重複]
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。
-
[解決済み] C 言語の配列へのポインタ/ポインタの配列の曖昧さ解消