2

私は、次の声明を確認または矛盾する文書を見つけようとしています。

char test[5]="";

と同じすべてのヌル文字に初期化されたバッファーになります

memset(test,'\0',sizeof(test));

しかし、何かを見つける(または理解/解読する)ことができませんでした。私は特に古い仕様の詳細を探しています.C99リファレンスも機能します. ありがとうございました

4

4 に答える 4

5

これはあなたの質問に対する完全な回答ではありませんが、他の回答の誤った情報を解決するのに役立ちます

ANSI C89 では、関連する標準テキストは次のとおりです (セクション 3.5.7)。

自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。

文字型の配列は、文字列リテラルで初期化することができ、オプションで中括弧で囲みます。文字列リテラルの連続する文字 (空きがある場合、または配列のサイズが不明な場合は、終端の null 文字を含む) は、配列のメンバーを初期化します。

文字列リテラルに対応する配列要素の初期化のみを指定します。そのため、末尾の配列要素は明示的に初期化されていないため、値は不定です。

次のような一節もありました。

集合体のメンバーよりもリスト内の初期化子が少ない場合、集合体の残りの部分は、静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

ただし、リストから初期化していないため、これは当てはまりません (「リスト」は、文字列リテラルではなく、中括弧で囲まれたリストを意味します)。


C90 (合法的にリンクできるかどうかはわかりません) では、これらの段落を含むセクションが 6.5.7 になるように、セクションの番号が付け直されました。後半の段落の文言も変更されました。

中括弧で囲まれたリスト内の初期化子が集合体のメンバーよりも少ない場合、集合体の残りの部分は、静的な保存期間を持つオブジェクトと同じように暗黙的に初期化されます。


C90 TC1 ( HTMLPDF ) では、上記は変更されていません。

ただし、欠陥レポート 60では、重要な質問が尋ねられました。

char (または wchar_t) の配列が配列より少ない文字を含む文字列リテラルで初期化される場合、配列の残りの要素は初期化されますか?

節 6.5.7 初期化、ページ 72 は、次のように述べています (強調は私のものです):

中括弧で囲まれたリスト内の初期化子の数が集合体のメンバーよりも少ない場合、集合体の残りの部分は、静的な保存期間を持つオブジェクトと同じように暗黙的に初期化されます。

修正

セクション 6.5.7 の 72 ページ、セマンティクスの最後から 2 番目の段落 (例の前) で、カンマの後に次を追加します。

既知のサイズの配列を初期化するために使用される文字列リテラルまたはワイド文字列リテラルの以下の文字、および character または wchar_t 型の要素

C90 TC2では、同じ重要な変更が行われていることがわかります。

72ページ

セクション 6.5.7 の 72 ページ、セマンティクスの最後から 2 番目の段落 (例の前) で、カンマの後に次を追加します。

既知のサイズの配列を初期化するために使用される文字列リテラルまたはワイド文字列リテラルの以下の文字、および character または wchar_t 型の要素

私たちに与える:

中括弧で囲まれたリスト内の初期化子が集合体のメンバーよりも少ない場合、または既知のサイズの配列を初期化するために使用される文字列リテラルまたはワイド文字列リテラル内の文字数が少なく、文字または wchar_t 型の要素の残りの部分が集約は、静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

TC1 の日付は 1995 年ですが、TC1 の日付は 1994 年であることに注意してください。おそらく、TC1 の作業は、その時点で新しい欠陥レポートに対処するにはあまりにも進んだ段階にあり、バックログが蓄積されていたのでしょうか? いずれにせよ、TC2 はほとんどが欠陥報告に応じた一連の修正であり、変更が最初に見られたのは C95 ではなく、C95 ではなく、ヌル ターミネータの後の文字のゼロ初期化が C89 標準の作成者が持っていたものであったことを示唆しています。意図されました。


ISO C99 (元のバージョン、技術的な正誤表なし) では、そのパラグラフは 6.7.8/21 に番号が付け直され、再び変更されました。「ワイド文字列リテラル」および「文字または wchar_t 型の要素」の言及が削除されました。

集合体の要素またはメンバーよりもブレースで囲まれたリスト内の初期化子の数が少ない場合、または配列内の要素よりも既知のサイズの配列を初期化するために使用される文字列リテラルの文字数が少ない場合、集合体の残りの部分は静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

末尾の配列要素が null バイトに初期化されることを意味します。

(注: 元の C99 は著作権で保護された素材である可能性があるため、上記にリンクを投稿することはできません。しかし、それはそのように書かれています。自由に利用できる最新のワーキング ドラフトへのリンクを次に示します。さらに 2 つのドラフトがありました。その後、しかしWG14のウェブサイトはそれらを削除しました. それにもかかわらず、その文言はN843ワーキングドラフトにあり、TC3を組み込んだ後のC99にまだ存在しています. )


C95 (ISO/IEC 9899:1990/AMD1:1995) の無料コピーを見つけることができませんでした。したがって、C89 と C99 の間のどの時点で「ワイド文字列リテラル」と「wchar_t」の変更が行われたかについては、正確にはお答えできません。また、件名は C99 Rationale ドキュメントでは言及されていません。

もちろん、C99 の動作が C89 の作成者の意図であり、欠落しているテキストが見落としである可能性はありますが、その趣旨に関する何らかのドキュメントがないため、結論を引き出すことはできません。その時、後続の要素を初期化しません。

これらのドキュメントを持っている (または ISO ストアから購入したいと考えている) 誰かが正確な回答を提供してくれることを願っています。

于 2020-03-04T22:51:28.467 に答える