基本的な算術を英語に翻訳する小さなプログラムを書くことから始めて、私は評価の順序を表すために二分木(必然的に非常に不均衡です)を構築することになります。まず、私は書いた
struct expr;
typedef struct{
unsigned char entity_flag; /*positive when the oprd
struct represents an entity
---a single digit or a parenthesized block*/
char oprt;
expr * l_oprd;// these two point to the children nodes
expr * r_oprd;
} expr;
ただし、1桁を効率的に表すために、私は
typedef struct{
unsigned char entity_flag;
int ival;
} digit;
各「expr」構造体の「oprd」フィールドは上記の構造体のいずれかである可能性があるため、これらのタイプを次のように変更します。
void * l_oprd;
void * r_oprd;
次に、「中心的な質問」があります。voidポインタを介してメンバーにアクセスするにはどうすればよいですか。次のコードを参照してください
#include<stdio.h>
#include<stdlib.h>
typedef struct {
int i1;
int i2;} s;
main(){
void* p=malloc(sizeof(s));
//p->i1=1;
//p->i2=2;
*(int*)p=1;
*((int *)p+1)=2;
printf("s{i1:%d, i2: %d}\n",*(int*)p,*((int *)p+1));
}
コンパイラはコメント付きバージョンを受け入れません!上記の雑然としたアプローチでそれを行う必要がありますか?
助けてください。
PS:お気づきのとおり、上記の各構造体は「entity_flag」という名前のフィールドを持っているため、
void * vp;
...(giving some value to vp)
unsigned char flag=vp->entity_flag;
ボイドが何を指しているかに関係なくフラグを抽出できますが、これはCで許可されていますか?またはCで「安全」ですか?