質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1032閲覧

配列の0による初期化について

sk1116

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/10/26 02:13

編集2021/10/26 16:48

C言語を「スッキリわかるC言語」で学習中です。

c

1コード 2int x[5]={1}; //配列の中身:1 0 0 0 0…(1) 3 4char y[10]=“hello”; //hello 0 ????…(2) 5 6char z[5]={1}; // ?…(3) 7

上記の(1)のようにint[]型を初期化する場合、明示した部分以外は0で初期化されると学びました。

しかし、入門書を読んでいくと(2)の場合は終端以降の値は決まらないと書いてありました。

“hello”と初期化しているのだからint[]型のように残りは0になるのではと思ったのですがなぜこのようになるのでしょう?

もし、char[]型が特殊なのであれば(3)の中身も1以降は0で初期化されないのでしょうか?

実際にこれらの文を試してみたのですが私の使っている環境だと?の部分は全て0になってしまうのでわかりませんでした。回答よろしくお願いします。

入門書に書いてある内容↓

#include<stdio.h> typedef char String[1024]; int main(void) { String str="hello";    for(int i=0; i<10; i++){ printf("%d, ",str[i]); } return 0; } //結果:104, 101, 108, 111, 0, (24, 82, 124, 41) 実行する環境によって違う

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/10/26 03:03

マークダウン記法を用いてのソースコード貼り付けは ```C #include <stdio.h> int main() { // hoge } ``` のように書きます。投稿前にプレビューを確認しましょう。
dodox86

2021/10/26 03:05

また、ソースコード中に全角の空白が入ったりしないよう気を付けましょう。実行する環境で動きに違いがあるのであれば、その環境の詳細も質問文中に提示しましょう。
sk1116

2021/10/26 03:10

ご指摘ありがとうございます。 直してみたのですが、これで合っているでしょうか?
dodox86

2021/10/26 03:11

> 実行する環境で動きに違いがあるのであれば、 C言語規格が制定される前の古い、古~いコンパイラであったり、ある種の制限付きの組み込み用途Cコンパイラであったりすると、全てのC言語仕様に合致していないことがあります。
dodox86

2021/10/26 03:18

> 直してみたのですが、これで合っているでしょうか? 合ってないです。かろうじてソースコード部分はプレーンテキスト状態で表示されていますが。 > c > コード > ``` て最後に出てますよね。
sk1116

2021/10/26 03:19

つまり、昔のものでは()の中が0にはならないものもあるけれど、最近のものは0になるということですか?
dodox86

2021/10/26 03:23

> つまり、昔のものでは()の中が0にはならないものもあるけれど、最近のものは0になるということですか? 即答はしかねます。回答をいただいていますので、そちらの内容(C言語規格)と照らしてお使いのCコンパイラの動作を判断する必要があります。
guest

回答1

0

ベストアンサー

入門書を読んでいくと(2)の場合は終端以降の値は決まらないと書いてありました。

本の間違いじゃないですか?
入門書はともかく、C言語のJIS規格書(JIS X3010でググれば読めます)の 6.7.8 初期化 の項には

集成体型の要素又はメンバの個数より波括弧で囲まれた並びにある初期化子が少ない場合,又は大きさが既知の配列の要素数よりその配列を初期化するための文字列リテラル中の文字数が少ない場合,その集成体型の残りを,静的記憶域期間をもつオブジェクトと同じ規則で暗黙に初期化する。

と明記されています。

投稿2021/10/26 02:20

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sk1116

2021/10/26 03:03

回答ありがとうございます! 質問を編集して、本に書かれていた内容を見にくいですが追加しました。これも本来であれば()の中はすべて0になるということでよいのでしょうか?
SaitoAtsushi

2021/10/26 04:34

言語仕様通りであれば 0 になるべきです。 ANSI によって 1989 年に規格化されるよりも前に事実上のリファレンス本だった The C Programming Language (初版1978年出版) でもゼロ初期化される旨の記載はありますので、かなり初期からそのように決まっていたものと考えられます。 ちなみに何かの本について質問する場合は何という本なのか明示するのが良い習慣です。 同じ本で同じように引っかかった人がここにたどり着く可能性が出来ますので。
thkana

2021/10/26 04:45

本来というか「規格ではこう決まっている」という話です。 さすがにそのような変数の初期化あたりで規格と違う振る舞いをするコンパイラはまずないと思いますが、重箱の隅的には規格に厳密には則っていないことはときどきあります。工業製品で「道具」ですからそれを使わざるを得なければ非準拠を承知して使うこともなくはないです。
thkana

2021/10/26 04:47

'typedef char String[1024];' でググると、「スッキリわかるC言語」なのかな。
sk1116

2021/10/26 16:56

本は「スッキリわかるC言語」です。 例外はあると言うことなのですね。 お二方詳しく教えてくださり本当にありがとうございます。 お陰で疑問を解消することができました! これからも勉強頑張ろうと思います!
SaitoAtsushi

2021/10/26 18:15

今回の質問の事例とは条件が違いますが規格通りにゼロ初期化しない例に遭遇した話がツイッタで流れているのをこないだ見ました。 https://twitter.com/tkihira/status/1443522152200736776 デバイスの性質によってはこういうこともまあまあ有る話なんでしょう。 パソコン用の処理系だったら大顰蹙でしょうが……。 規格というのは逆らったからといってそれ自体に罰則があるわけでもなく、準拠しないならしないで (当事者が納得していれば) 特に悪いことではないです。 例えば「こういう仕様の言語で開発して!」と毎回分厚い仕様を取り交わして契約するよりは「ISO の×××番の仕様でやってね」のほうが簡単だし、なるべく多くの場面で同じ仕様だったら楽だなぁということで業界の人が話し合って作るのが規格なわけです。 規格の範囲内で出来るものなら規格の範囲内でやるべきですが、それだけであらゆるところをカバーできるわけではないのも現実です。 ですが逆に言えば仕様の共通認識が出来ていないなら問題です。 入門書と読者の関係において「C 言語を教える」という場面であえて規格通りではない場合の説明をするのはおかしいですし、常識的には本が間違っていると言っていい状況でしょうね。 読者としては規格外の状況を学びたいと思って読んでいるわけではないでしょうから。
thkana

2021/10/26 22:28

SaitoAtsushiさん 「main(){printf("Hello world.");」とかギリギリの線を攻めてくる本もあったりしそう。「Cの絵本」なんかは結構あぶなかったような。あくまで「C言語の入門書」であれば、まずは規格に書かれている事項には準拠するべきでしょうね。 いやまぁ歴史的にはシェアの大きいVisualStudio(MicrosoftC/C++)が2012までC99(1999年版規格)に準拠しなくて、その間VSをターゲットに書かれた解説書が軒並みANSI C(1989年版規格)準拠になる、なんていうゴタゴタもありました。「C言語では変数の宣言はブロック開始の直後でなければいけません」なんて散々聞いたなぁ。 ツイッターの話 組み込みだと、ツールチェーンにデフォルトというかサンプルのスタートアップコード(リセットからmain()を呼ぶまで)がアセンブラレベルで付いてきて、必要に応じて手を入れるという形式では。ツッコミを入れるなら、それはコンパイラじゃなくてオマケの初期化コードがそうなっていただけじゃない? というところ。ここで言っても仕方ないか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問