アプリ版:「スタンプのみでお礼する」機能のリリースについて

写真のc言語の問題がa以外わかりません。
正直aも自信がなく、解説していただけないでしょうか?
答えは配列名 使用中領域 使用可能領域 の順で
a 1000~1005番地 1000~1005番地
b 2000番地のみ  2000~2005番地
c 3004~3006番地 3000から3009番地
となっています

「写真のc言語の問題がa以外わかりません。」の質問画像

質問者からの補足コメント

  • 答えは自分の解答ではなく
    教科書の解答となります。

    また文字列終端/0は含むものとします

      補足日時:2022/04/29 19:12

A 回答 (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の使用可能領域」には違和感しかないです。
    • good
    • 1
この回答へのお礼

なるほどー!わかりやすいです!

お礼日時:2022/04/29 22:10

#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;
}
    • good
    • 1
この回答へのお礼

まさか、コードを書いてくださるとは!
ありがとうございます!

お礼日時:2022/04/29 22:04

自分が知っている限りだと、「使用中領域」「使用可能領域」は公式な用語(C言語規格に書かれてるとか。

)として存在しないので、お使いの教科書にどのように定義されてるか補足しないと、正答は不明と思われます。

憶測しかないですが、文字列終端(='\0')を使用中に含めるなら、かまぼこここさんの答えで合ってるような気がします。
    • good
    • 1
この回答へのお礼

使用中領域、使用可能領域は参考書にも定義されておらず説明ができませんが補足情報に/0を含めるかなど書き込みもう少し待ってみます。
情報ありがとうございます!

お礼日時:2022/04/29 19:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!