c言語の配列について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
telepas

c言語の配列について

#1

投稿記事 by telepas » 10年前

C言語におけるメモリの様子や型とは何なのかがいまいちイメージできません。
調べるほどに混乱してきています。明解ない説明をよろしくお願いします。
特に下に書く3点が気になりますので、そちらの方も併せてご指導願いします。


「char型の配列をメモリ上に10バイト用意し、文字列abcを格納する」 → char s [ 10 ] = "abc";
この時、"abc"の先頭アドレスがs [ 0 ]に格納されているという解釈であっているのでしょうか?

またメモリ上には、 s[0]には 'a' が、s[1]には 'b'が、 s[2]には'c'が、s[3]には '\0'が入っていると思うのですが、
それ以降(s[4]~s[10])には何が入っているのでしょうか? ' \0 ' なのか、それとも空なのか気になります。

あと、書籍には' a ' はchar型だとありましたが、C言語はデータを数値で扱うとも書いてありました。
この場合の数値とは文字コードという意味なのでしょうか?


どうか宜しくお願い致します。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: c言語の配列について

#2

投稿記事 by h2so5 » 10年前

telepas さんが書きました: 「char型の配列をメモリ上に10バイト用意し、文字列abcを格納する」 → char s [ 10 ] = "abc";
この時、"abc"の先頭アドレスがs [ 0 ]に格納されているという解釈であっているのでしょうか?
s[ 0 ]には 'a' が格納されています。
telepas さんが書きました: またメモリ上には、 s[0]には 'a' が、s[1]には 'b'が、 s[2]には'c'が、s[3]には '\0'が入っていると思うのですが、
それ以降(s[4]~s[10])には何が入っているのでしょうか? ' \0 ' なのか、それとも空なのか気になります。
そもそも「空」という状態は存在しませんので、必ず何らかの値が入っています。
s[4]~s[10]になにが入っているかは実際にアクセスしないと分かりません。
静的記憶領域に存在する変数の場合は' \0 'が入っていますが、そうでない場合はなにが入っているかは不定です。

記憶領域に関係なく' \0 'で初期化されます。失礼しました。

§ 8.5.2
If there are fewer initializers than there are array elements, each element not explicitly initialized shall be
zero-initialized (8.5).
telepas さんが書きました: あと、書籍には' a ' はchar型だとありましたが、C言語はデータを数値で扱うとも書いてありました。
この場合の数値とは文字コードという意味なのでしょうか?
そうです。

アバター
せんちゃ
記事: 50
登録日時: 13年前
住所: 江別市東野幌町
連絡を取る:

Re: c言語の配列について

#3

投稿記事 by せんちゃ » 10年前

telepas さんが書きました: 「char型の配列をメモリ上に10バイト用意し、文字列abcを格納する」 → char s [ 10 ] = "abc";
この時、"abc"の先頭アドレスがs [ 0 ]に格納されているという解釈であっているのでしょうか?
ちょっと違います。
char配列の初期化はcharのポインタとは事情が少し異なっています。

コード:

char s [ 10 ] = "abc"
は実際のところは

コード:

char s[10] = { 'a' , 'b' , 'c','\0' };
と解釈されています。
なので

コード:

	const char* txt = "abc";
	char s[10] = txt;
とかは文法エラーになります。
文字列定数の先頭アドレスを格納しているわけではないからです。

telepas さんが書きました: またメモリ上には、 s[0]には 'a' が、s[1]には 'b'が、 s[2]には'c'が、s[3]には '\0'が入っていると思うのですが、
それ以降(s[4]~s[10])には何が入っているのでしょうか? ' \0 ' なのか、それとも空なのか気になります。
4から10まではすべて\0が入ります。(コンパイラ依存かもしれないです)
char配列の初期化時はかならず文字列+1つのサイズがないといけません。
なので

コード:

	char c[3] = "abc";
これは4番目に0が入れられないのでエラーになります。
telepas さんが書きました: あと、書籍には' a ' はchar型だとありましたが、C言語はデータを数値で扱うとも書いてありました。
この場合の数値とは文字コードという意味なのでしょうか?
その認識で大丈夫だと思います。
'a'や'b'や'c'は実際には整数のデータです。
ヽ(*゚д゚)ノ カイバー

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: c言語の配列について

#4

投稿記事 by h2so5 » 10年前

せんちゃ さんが書きました: char配列の初期化時はかならず文字列+1つのサイズがないといけません。
なので

コード:

	char c[3] = "abc";
これは4番目に0が入れられないのでエラーになります。
C++だとエラーになりますがCでは合法です。

アバター
せんちゃ
記事: 50
登録日時: 13年前
住所: 江別市東野幌町
連絡を取る:

Re: c言語の配列について

#5

投稿記事 by せんちゃ » 10年前

h2so5 さんが書きました: C++だとエラーになりますがCでは合法です。
失礼しました、こちらの知識不足です。
ヽ(*゚д゚)ノ カイバー

閉鎖

“C言語何でも質問掲示板” へ戻る