
No.3ベストアンサー
- 回答日時:
正直、そんな教科書捨てちゃえ、って思えるほどの内容だなぁと。
使用中領域:
文字列として有効な範囲
= 「先頭から'\0'の直前まで + 終わりを表わす '\0'」 の領域
使用可能領域:
領域として確保しているので、(意図的にやらない限り)他の変数等と干渉しない領域
って感じかな、と。
○ T型のポインタに +n すると、番地はT型のサイズがn分だけ変化する。
なので、プログラムでは +1 になっていても、番地は+4になっている、等がある。
○ 今回はchar型はsizeof(char)=1 なので、配列1要素分が1番地に相当するから、プログラムでは +1 で番地は+1になる。
char a[] ="hello" ;
は
char a[] ={'h','e','l','l','o','\0'} ;
の別の表記方法で、配列長は自動で設定されて
char a[6] ={'h','e','l','l','o','\0'} ;
と同じになる。
・文字列aとして解釈されるのは、5文字+\0 で6文字分なので、1000から1005番地を使用中
・配列aとして「0から5」の6要素を確保しているので、1000から1005番地が使用可能
char b[]={0,1,2,3,4,5};
も同様に
char b[6]={0,1,2,3,4,5};
と同じになる。
・文字列bとして解釈されるのは、0文字+\0 で1文字分なので、2000番地だけを使用中
・配列bとして「0から5」の6要素を確保しているので、2000から2005番地が使用可能
char* heap = calloc(10, sizeof(char));
は char 10個分の領域を確保し、内容を0で初期化し、その領域を charへのポインタ heap の値としている。
char* c = heap + 4;
で c = heap +4 = 3004番地になる。
c[0] = 'S'; /* → *(c+0) = 'S' の意味なので、 3004番地は'S' に */
c[1] = 'C'; /* → *(c+1) = 'C' の意味なので、 3005番地は'C' に */
/* c[2] (=3006番地はcallocで 0 の初期化済み */
・文字列cとして解釈されるのは、2文字+\0 で6文字分なので、3004から3006番地を使用中
・配列cはポインタheapとして10要素を確保しているので、3000から3009番地が使用可能
というのが、「教科書の解答」なのでしょう。
ですが、正直「cの使用可能領域」には違和感しかないです。
No.2
- 回答日時:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>
int main(void) {
char a[] = "hello";
char b[] = {0, 1, 2, 3, 4, 5};
char* heap = calloc(10, sizeof(char));
char* c = heap + 4;
c[0] = 'S';
c[1] = 'C';
/* どうなってるのか実際に出力させてみて見てみれば良い */
/* ただし、'\0' は出力出来ないので、これだけはアタマの中でカウントする */
for (char* p = a; *p != '\0'; p++) {
printf("%p %c\n", p, *p);
}
/* ちなみに、b の答えは間違ってると思う */
for (char* p = b; (isascii(*p) == true) && (*p < 6); p++) {
printf("%p %d\n", p, *p);
}
/* 正直、cの回答も、heap と c を一緒くたに考えてないか? */
int count = 0;
for (char* p = heap; count < 10; p++) {
printf("%p %c\n", p, *p);
count++;
}
free(heap);
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++で、メンバもヒープに確保さ...
-
x64環境で連続4GB以上のメモリ...
-
C言語において、 配列要素をひ...
-
C言語 配列の長さの上限
-
ポインタに ~0を入れること
-
vbでDataTableの抽出コピー
-
VBを2008を用いてCSVを取り込む...
-
Visual Basic 6.0 と8.0と2015
-
配列を返り値、でエラー
-
9枚の写真がA4 1枚に印刷できま...
-
PHP MySQL自動連番で削除された...
-
aspでユーザー定義の構造体を作...
-
配列で格納したものをmsgboxで...
-
c言語
-
【速いブラインドタッチ】手を...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
RGB値を画像(PNG・BMPJPEGなど)...
-
関数のパラメタ(C++)
-
関数から配列を返すには?
-
CopyMemory()をmemcpy()に書き...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
allocってなんですか?
-
c言語のポインタへの文字列入力...
-
HEAP に関すること
-
構造体でchar name[]と*nameの...
-
ビットをローテートするプログ...
-
ヒープメモリの解放について
-
DLLのマルチスレッドの動作につ...
-
グローバル変数のサイズ
-
C++で、メンバもヒープに確保さ...
-
newしないオブジェクトについて
-
free関数で動作が止まる
-
構造体配列の初期化について
-
void*型のデータサイズ
-
MFCのCStringについて
-
mallocで確保するメモリの領域...
-
CreateFileMapping について
-
LPWSTRのコピー
-
c言語のメモリの確保について
-
配列の添え字の最大数とは?
-
C言語の質問です。 以下の命令...
おすすめ情報
答えは自分の解答ではなく
教科書の解答となります。
また文字列終端/0は含むものとします