教えてください

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

教えてください

#1

投稿記事 by エターナル » 17年前

実は次のような宿題を出されたので教えてください
次の変数pのバイト数を答えなさい。(CPUのワード長は32ビットとする)
 int ***************p;

次の変数stSample のデータサイズを答えなさい。(CPUのワード長は32ビットとする)
 struct sample {
  int a;
  char b;
  int c;
 }stSample;

次のプログラムに問題はありますか?
問題がある場合は、問題となる処理と理由も答えてください。

int *func (void)
{
int a = 10;
return &a;
}

int main (void)
{
int *a;
a = func();
return *a;
}

次のプログラムを実行した場合の出力結果を答えてください。

#include <stdio.h>

void func1()
{
printf("func1\n");
}

void func2()
{
printf("func2\n");
}

void func3()
{
printf("func3\n");
}

void func(int iNo)
{
void (*pFunc[/url])(void) = {func1, func2, func3};

pFunc[iNo]();
}

int main(void)
{
func(1);
}
よろしくお願いします。

たかぎ

Re:教えてください

#2

投稿記事 by たかぎ » 17年前

どこかで見覚えがあると思ったら、
http://www.play21.jp/board/formz.cgi?ac ... &rln=13611
と同じではないでしょうか?

エターナル

Re:教えてください

#3

投稿記事 by エターナル » 17年前

ホントですね、クラスの子かもです。

でも最初の二つはかぶってますけどほかのは違うとこなので教えてください。
あと最初の二つは環境依存って書いてありますが、ちゃんと環境の明記をしてるので、
この場合どうなるのかお願いします。

たかぎ

Re:教えてください

#4

投稿記事 by たかぎ » 17年前

> でも最初の二つはかぶってますけどほかのは違うとこなので教えてください。

そのようですね。
3つ目の問題ですが、生存期間を終えたオブジェクトの値を参照しているので問題があります。
最後の問題は実際に動かしてみれば分かります。

> ちゃんと環境の明記をしてるので

もしかして

> CPUのワード長は32ビットとする

のことでしょうか?
これだけでは環境を明記したことにはなりません。
コンパイラとコンパイルオプションを明記してください。

tk-xleader

Re:教えてください

#5

投稿記事 by tk-xleader » 17年前

一つ目は4バイトとなると思います。
二つ目はやはり環境依存(パディングなしで9バイト)
三つ目は問題ありです。ローカル変数のアドレスを返してはいけません。返した後そのアドレスは無効になります。
四つ目:

func2

となります。

たかぎ

Re:教えてください

#6

投稿記事 by たかぎ » 17年前

もう少し詳しく書いておきます。

CPUのワード長が32ビットで、仮にポインタが32ビットだとしても、char型が何ビットなのかが分かりません。
例えば、CHAR_BITが16ビットの場合、ポインタのサイズは「2バイト」ということになります。

2番目の問題に関しては、CPUのワード長が32ビットでも、int型やchar型が何ビットかは特定できません。
int型に関しては32ビットになるケースが多いのは確かですが、32ビットCPUでint型が16ビットの処理系も複数実在します。
また、char型とint型のサイズが同じであれば、struct sample型は3バイトになる可能性が高いでしょう。ただし、コンパイラによっては、構造体だというだけで強制的に特定の境界調整を要求する場合がありますので、4バイトとかになっても不思議ではありません。char型とint型のサイズが異なる場合も境界調整に完全に依存します。

閉鎖

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