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で質問しましょう!
似たような質問が見つかりました
- 数学 【 数I 因数分解 】 問題 a³+b³=(a+b)³-3ab(a+b)を利用して a³+b³+c³ 4 2022/07/16 08:13
- 数学 【 数A 順列 】 問題 A,B,C,D,E,F,Gの7人が1列に並ぶとき, A,Bの2人が間に2人 4 2022/06/19 12:48
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- 数学 【 数A 順列 】 問題 6個の数字0,1,2,3,4,5,を使ってできる次 のような整数は何個ある 7 2022/06/19 12:33
- 英語 写真の問題についてですが、赤丸部分を見ると、any〜notという語順になっていると思うのですが、この 4 2023/08/18 01:34
- 物理学 示すように,真空中の直交座標系を考える。y平面に平行な つ領域Iと領域Iがあり,軸上の領域Iと領域I 1 2023/06/25 14:46
- その他(パソコン・スマホ・電化製品) 生化学の問題です。 解説をお願いします。 (真核生物の遺伝子発現調節について) 翻訳の過程では様々な 2 2023/06/04 15:10
- 数学 写真の数学の問題(2)についての質問です。 ∠Aの2等分線とBCとの交点がRでBC=aで、 あとは点 1 2023/07/02 12:34
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
newしないオブジェクトについて
-
64ビットと32ビットの違い
-
大容量の静的な確保の限界値
-
callocの処理速度
-
GDI+におけるメモリの開放について
-
newでrealloc?
-
malloc呼び出し時のセグメンテ...
-
構造体でchar name[]と*nameの...
-
allocってなんですか?
-
プログラムが途中で強制終了し...
-
C++のnewで確保したメモリーの...
-
fread関数および動的なメモリ確...
-
画像を読み込む配列の確保。
-
void*型のデータサイズ
-
ビットをローテートするプログ...
-
アンマネージド関数でのメモリ...
-
C++で、メンバもヒープに確保さ...
-
MSDNがgethostbynameではなくge...
-
配列の添え字の最大数とは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
mallocについて
-
配列の添え字の最大数とは?
-
ヒープメモリの解放について
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
malloc呼び出し時のセグメンテ...
-
プログラムが途中で強制終了し...
-
指定したメモリアドレスの値の...
-
スタック破壊の上手な見つけ方...
-
void*型のデータサイズ
-
ポインタのポインタの初期化法
-
free関数で動作が止まる
-
callocの処理速度
-
MSDNがgethostbynameではなくge...
-
C++のnewで確保したメモリーの...
-
sprintf()の使い方について
-
Accessで、メモリを開放するタ...
おすすめ情報
答えは自分の解答ではなく
教科書の解答となります。
また文字列終端/0は含むものとします