2

知りたいのですが、structure1をstructure2で初期化できるのでしょうか。私もキャスティングの概念に不慣れです。このコードの出力はゼロでなければなりません。ご案内ください。ありがとう!

#include<stdio.h>

typedef struct student
{
 int roll_id[10];
 int name_id[10];
 int postn;
} student;

typedef struct exams
{
int subject[10];
int area;
}exams;

int main()
{
 exams e= { {0} };
 student *pptr= (student*)&e;
 printf (" %d\n", pptr->name_id[9]);
 return 0;
 }
4

2 に答える 2

2

例えは簡単です。
あなたはアップルを購入し、それがオレンジのふりをします。
食べられるものとして食べれば食べられますが、オレンジジュースを期待して噛むとがっかりします。

Apple&Orangeを2つの構造に置き換え、あなたをコンパイラに置き換えます。

構造は、通常、さまざまなデータ型によって占有されるメモリのブロックに他なりません。コンパイラの実装では、構造体の最初の型を除いて、これらの型の間にパディングバイト
を追加できます。 両方の構造の最初のタイプは同じであるため(10個の整数の配列)。他のタイプの構造のふりをすることはできますが、最初のタイプ以外の他のデータタイプにアクセスしようとすると、未定義動作になります。
examstudent

未定義動作は、コードで取得しているものです。

結論:
これはできません。

于 2013-01-08T09:39:37.433 に答える
0

まず、コードでは、structure1をstructure2で初期化するのではなく、structure2へのポインターをstructure1へのポインターとして偽装するだけです。

exams構造インスタンスは明らかに(奇妙な配置設定は言うまでもなく)学生よりもメモリを消費しませんinstance。アクセスpptr->name_id[9]すると、専用の領域を超えて読むことができeます。今では、すべてはコンパイラやコンピュータなどに依存します。つまり、自分のためにそのような詳細を掘り下げることは避けたほうがよいということです。

このコードの出力はゼロでなければなりません

おそらく、未割り当てのスタック領域(過去e)から読み取っていて、実行中のスレッドに渡す前に、セットアップスタックがゼロで埋められている場合です。

キャストと自動メモリ、インスタンスとポインタについては、Cブックで詳細をお読みください。コードを正しくするために伝えるべきことは本当にたくさんあります。トピックについてもっと勉強した後は、もっと具体的な質問をしたほうがいいでしょう。幸運を

于 2013-01-08T10:02:32.620 に答える