実は次のような宿題を出されたので教えてください
次の変数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:教えてください
ホントですね、クラスの子かもです。
でも最初の二つはかぶってますけどほかのは違うとこなので教えてください。
あと最初の二つは環境依存って書いてありますが、ちゃんと環境の明記をしてるので、
この場合どうなるのかお願いします。
でも最初の二つはかぶってますけどほかのは違うとこなので教えてください。
あと最初の二つは環境依存って書いてありますが、ちゃんと環境の明記をしてるので、
この場合どうなるのかお願いします。
Re:教えてください
> でも最初の二つはかぶってますけどほかのは違うとこなので教えてください。
そのようですね。
3つ目の問題ですが、生存期間を終えたオブジェクトの値を参照しているので問題があります。
最後の問題は実際に動かしてみれば分かります。
> ちゃんと環境の明記をしてるので
もしかして
> CPUのワード長は32ビットとする
のことでしょうか?
これだけでは環境を明記したことにはなりません。
コンパイラとコンパイルオプションを明記してください。
そのようですね。
3つ目の問題ですが、生存期間を終えたオブジェクトの値を参照しているので問題があります。
最後の問題は実際に動かしてみれば分かります。
> ちゃんと環境の明記をしてるので
もしかして
> CPUのワード長は32ビットとする
のことでしょうか?
これだけでは環境を明記したことにはなりません。
コンパイラとコンパイルオプションを明記してください。
Re:教えてください
一つ目は4バイトとなると思います。
二つ目はやはり環境依存(パディングなしで9バイト)
三つ目は問題ありです。ローカル変数のアドレスを返してはいけません。返した後そのアドレスは無効になります。
四つ目:
func2
となります。
二つ目はやはり環境依存(パディングなしで9バイト)
三つ目は問題ありです。ローカル変数のアドレスを返してはいけません。返した後そのアドレスは無効になります。
四つ目:
func2
となります。
Re:教えてください
もう少し詳しく書いておきます。
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型のサイズが異なる場合も境界調整に完全に依存します。
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型のサイズが異なる場合も境界調整に完全に依存します。