• ベストアンサー

structでvoid*型を利用して中身を動的に変化させる

構造体の中にvoid*型のポインタを作り、そこの中身を替えることでデータを変えたいと思っています。 例 struct DATA{ void* p; } struct PROF_1{ char* name; int age; } struct PROF_2{ char* name; int age; int level; } void main(){ struct DATA data; struct PROF_1 p1={"HATOYAMA", 60}; struct PROF_2 p2={"OBAMA", 60, 1}; data.p = p1; printf("Name[%s] Age[%d]\n", (PROF_1)(data.p)->name, (PROF_1)(data.p)->age); data.p = p2; printf"Name[%s] Age[%d] Lv[%d]\n", (PROF_2)(data.p)->name, (PROF_2)(data.p)->age, (PROF_2)(data.p)->level); } このような感じで構造体の中にあるvoid*型のポインタの参照する場所を変えるだけで構造体の中身を変化させることが出来ないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>void*型のポインタの参照する場所を変えるだけで構造体の中身を変化させることが出来ないでしょうか? できます。 使用する型がわかっているのであればunionで定義する方法もありますが。 struct DATA{  int type;  // 入れている型  union  {   struct PROF_1 data1;   struct PROF_2 data2;  }packet;  // 供用の定義 } とか。 もちろんポインタも使用できます。

Hoxy2142
質問者

お礼

なるほど、共用体を使えばいいのですね。 ありがとうございます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

もちろんできます. ただし, 「現在入っているのはどの型なのか」をきちんと意識する必要はあります.

Hoxy2142
質問者

お礼

楽をするにはどこかで苦労する必要があるのですね。

関連するQ&A

  • C言語 「構造体のソートと結果のファイル出力」 緊急です。助けてください。

    授業で課題が出され内容は以下となってます。 1.歴代アメリカ大統領の情報を構造体とする. 2.ソートを昇順で行うこと 3.結果を出力すること〔参考:http://www-it.sci.waseda.ac.jp/CPR1/class08/kekka.log) 以下が自分で作ってみたものですが、多数のエラーが出てしまいどうしたらいいのか分かりません。。。抜本的な変更でもかまいませんので、分かる方助けてください。 -----作成分------ #include <stdio.h> #include <string.h> struct president { int no, age; char name1[20], name2[20]; /* 氏名 */ }; int main(void) { int i; struct president pre1[44] = { {1,57,"George","Washington"}, {2,61,"John","Adams"}, {3,57,"Thomas","Jefferson"}, //リストが長いので省略// {44,47,"Barack","Obama"}, }; struct president *pres; pres = pre1; //ポインタ// sort(pres, 44, sizeof(struct president), president_cmp);//ソート構文 エラーがでます。。。// printf("---------sortted list by age------- \n # age first last \n");} for (i = 0; i < 44; i++){printf("------------------------------------ \n") printf("%d %d %s %s \n, pres[i]->no, pres[i]->name, pres[i]->name1, pres[i]->name2);} for(i = 0; i < 44; i++) { if (i==0){printf("---------list of presidents---------- \n");//RAW DATAの表示を行ない。ここは問題ないみたいです// printf(" age first last \n");}; printf("%d %d %s %s \n", pres->no, pres->age, pres->name1, pres->name2); ++pres; } return 0; } int president_cmp(const void*p1, const void*p2){ //比較関数// struct president *cmp1 = (struct president*)p1; struct president *cmp2 = (struct president*)p2; return strcmp(cmp1->age, cmp2->age); } ここにファイル出力の分をたしたいのですが、どこにどうすればいいのでしょう。 大変申し訳ありませんが、緊急です!!お願いします。

  • 構造体とポインタについて教えてください。

    #include <stdio.h> typedef struct ningen { char *name; char *sex; int age; } NINGEN; NINGEN data = {"牧村 五郎",NULL,30}; char mf[2][3] = {"男","女"}; void main(void) { data.sex=mf[0]; printf("%s (%s) %d歳\n", data.name, data.sex, data.age); } このプログラムで実行結果は 牧村 五郎 (男) 30歳 となるのですが、最初の typedef struct ningen { char *name; char *sex; int age; } NINGEN; のところで、nameとsexはアドレスで宣言しているので printf("%s (%s) %d歳\n", data.naem, data.sex, data.age);でのdata.naem, data.sexでの対象もアドレスを示していると思うのですが、 結果は値を表示しているのはなぜでしょうか?

  • 参照の参照、struct record **start, の使い方は?

    Linked List を作ってるのですが、 addRecord のプロトタイプが以下のようになってます。 int addRecord(struct record **start, char name[], char address[], int age); こうなると start->age = age; start.age = age; *start->age = age; ともコンパイルエラーになるのですが、対処法ありますでしょうか? ちなみに、これはポインタのアドレスを示すものですよね? これを参照の参照と呼ぶのかは確かではありませんが。。。

  • アルゴリズム 線形リスト

    最近リストについて習い始めました。入力したデータと同順に並ぶリストを作成しようと思い、コードを打ったのですが…動作中止の表示がでてしまいました。どこが間違っているのか、ずっと悪戦苦闘して組んでいるのですが、全く出口が見えてきません。何が間違えているのか、はたまた根本的に違うのか、ご指導して頂けると有難いです。 以下、コードです。 #include <stdio.h> #include <stdlib.h> #include <string.h> struct hito{ char name[20]; int age; struct hito *next; }; void main(void){ struct hito *p, *head, *dummy; char new_name[20]; int new_age; dummy = (struct hito *)malloc(sizeof(struct hito)); head = dummy; dummy->next = p; dummy = p; while (scanf("%s %d" , new_name, &new_age) != EOF) { p = (struct hito *)malloc(sizeof(struct hito)); strcpy(p->name, new_name); p->age = new_age; p->next = head; head = p; } while(p != NULL) { printf("\t%-20s %3d\n" , p->name, p->age); p = p->next; } }

  • C言語 家系図

    問題 構造体personを以下のように仮定する。 struct person { int age; char name[20]; struct person *father; struct person *mother; }; この構造体の表す人の名前、年齢、その人の父親の名前、およびその人の母親の名前を出力する関数 void print_person(struct person *p) を作成せよ。出力の形式は name: 本人の名前 age: 本人の年齢 father: 父親の名前 mother: 母親の名前 となるようにすること。 また、ポインタ father や mother の値が NULL のときには、名前のかわりに unknown と出力するようにせよ。 以上が問題なのですが自分でプログラムを作ってみたところ実行したら、エラーになって矯正終了されてしまいました。 以下が私の作ったプログラムです。 #include <stdio.h> struct person { int age; char name[20]; struct person *father; struct person *mother; }; void set_name(struct person *p, char name[]) { int i; i = 0; while (name[i] != 0) { p->name[i] = name[i]; i++; } p->name[i] = 0; } void print_person(struct person *p) { printf("name:%s", p->name); printf("age:%s\n",p->age); if(p->father != NULL){ printf("father:%s\n",p->father); } else{ printf("unknown"); } if(p->mother != NULL){ printf("mother:%s\n",p->mother); } else{ printf("unknown"); } } int main(void) { struct person me, dad, mom; set_name(&me, "Michael"); me.age = 16; me.father = &dad; me.mother = &mom; set_name(&dad, "David"); dad.age = 38; dad.father = NULL; dad.mother = NULL; set_name(&mom, "Susan"); mom.age = 36; mom.father = NULL; mom.mother = NULL; print_person(&me); print_person(&dad); print_person(&mom); return (0); } どこが違うのか教えていただけないでしょうか?

  • 構造体の構造体 引数

    構造体の中の構造体の関数の引き渡し方法がわかりません。 下記ソースで試したのですが、うまくいきませんでした。 助言お願いいたします。 //repo.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define NUM 20 #define MAX 15 struct seiseki{ float shu[3]; }; struct seito{ char name[NUM]; int age; struct seiseki kekka; }; void input(struct seito *p); void s_input(struct seiseki *p); void ss_input(struct seiseki *data); int main(){ int i; struct seito data[2]; for(i=0;i<2;i++){ printf("------------------------------\n"); printf("%d人目",i+1); input(&data[i]); } printf("%f\n",data[0].kekka.shu[0]); printf("%f\n",data[0].kekka.shu[1]); printf("%f\n",data[0].kekka.shu[2]); //data[1]に格納できない。 printf("%f\n",data[1].kekka.shu[0]); printf("%f\n",data[1].kekka.shu[1]); printf("%f\n",data[1].kekka.shu[2]); return 0; } void input(struct seito *p){ printf("名前->"); scanf("%s",p->name); printf("年齢->"); scanf("%d",p->age); s_input(&(p->kekka)); } void s_input(struct seiseki *data){ printf("国語->"); ss_input(data); printf("算数->"); ss_input(data); printf("英語->"); ss_input(data); } //下記関数で成績をchar型で受け取り、数値化したい。 void ss_input(struct seiseki *data){ char p[100]; int i=0; static int o=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("再入力してください"); scanf("%s",p); } i++; } data->shu[o]=atof(p); printf("%f\n",data->shu[o]); o++; }

  • このプログラムのポインタを配列に変換したいんですけど

    C言語初心者です。助けてください。 途中までがんばったのですがどうしてもできません。問題はこの構造体の*name→name[25],*email→email[30]に変換させたいのですが、そのまま変換すると左辺値が必要や移植性のないポインタ変換などのエラーが出てしまいます。どうすればいいですか?教えてください。あと関数getlineと構造体は変えないでください。(指定した部分は除く) このプログラムは名前、メールアドレス、年齢を保存していき-1を入力した時出力されるというものです。 よろしくお願いします。 入力例 10 hakata abc@・・・ 12 yokohama dfg@・・・ -1 -1 -1 出力例 -1 -1 -1 12 yokohama dfg@・・・ 10 hakata abc@・・・ #include <stdio.h> #include<stdlib.h> struct node { char *name; char *email; int age; struct node *next; } heap[100], *hp = heap; void getline(char *s,int n) { int c; while(--n>0&&((c=getchar())!=EOF && c!='\n')) *s++=c; *s='\0'; } char* dupstr(char* strg) { char* newstr; newstr=(char*)malloc(sizeof(char)*strlen(strg)); strcpy(newstr,strg); return newstr; } struct node *new(int n ,char* a, char* b) { hp->age=n; hp->email=a; hp->name=b; hp->next=NULL; return hp++; } struct node *add(struct node *p, struct node *q) { q->next=p; p=q; return p ; } void print_list(struct node *p) { while (p != NULL) { printf("%d ", p->age); printf("%s ", p->name); printf("%s ", p->email); p=p->next; } printf("\n"); } main() { int age,p; char buf[80],a[80],b[80],*email,*name; struct node *root=NULL; while(getline!=NULL) { getline(buf,sizeof(buf)); age=atoi(buf); getline(b,sizeof(b)); getline(a,sizeof(a)); email=dupstr(b); name=dupstr(a); root=add(root,new(age,email,name)); if(age==-1) break; } print_list(root); }

  • 関数への構造体の配列の渡し方<c言語初心者>

    こんにちは、関数への構造体の配列の渡し方で理解できない点があるため、質問させていただきます。 以下がスクリプトになります。3人の名前と年齢をinput関数で入力し、それらのデータをoutput関数で出力するのが目的です。 #include <stdio.h> typedef struct{ char name[64]; int age; }property; void input(property *data[]); void output(property *data[]); int main(void){ property data[3]; printf("Input data of three people.\n"); input(&data); output(&data); return 0; } void input(property *data[]){ int i; for(i=0;i<3;i++){ printf("%d banme\n",i+1); printf("name:"); scanf("%s",&data[i]->name); printf(" age:"); scanf("%3d",&data[i]->age); } return; } void output(property *data[]){ int i; for(i=0;i<3;i++){ printf("%d banme\n",i+1); printf("name:%s\n",data[i]->name); printf("age :%3d\n",data[i]->age); } return; } コンパイル時のエラーメッセージは以下のようになりました。(ファイル名はstructure5.c) structure5.c: In function ‘main’: structure5.c:14:2: warning: passing argument 1 of ‘input’ from incompatible pointer type [enabled by default] input(&data); ^ structure5.c:8:6: note: expected ‘struct property **’ but argument is of type ‘struct property (*)[3]’ void input(property *data[]); ^ structure5.c:15:2: warning: passing argument 1 of ‘output’ from incompatible pointer type [enabled by default] output(&data); ^ structure5.c:9:6: note: expected ‘struct property **’ but argument is of type ‘struct property (*)[3]’ void output(property *data[]); ^ structure5.c: In function ‘input’: structure5.c:24:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[64]’ [-Wformat=] scanf("%s",&data[i]->name); ^ 構造体の配列をinput関数やoutput関数に渡すときにエラーが発生しているようなのですが、自分で調べても解決できなかったため、質問させて頂きます。 皆様のお知恵を貸してください。なおプログラミング言語自体初心者のため、できる限りわかりやすいお言葉でご教授願います。よろしくお願い致します。

  • 名簿作成 表示について

    名簿作成のプログラム、コンパイルしたときに 自分で入れた名簿を全て表示させたいのですが main関数をどう変えれば出来るでしょうか? このままだと、1人分しか表示されません。 初心者なので丁寧に教えてくださればと思います。 #include<stdio.h> #define NAMELEN 30 #define NOLEN 10 char s; struct gakuseki{ char no[NOLEN]; char name[NAMELEN]; int age; }; struct gakuseki input_data(void){ struct gakuseki st; printf("input student number>"); scanf("%s",&st.no); /*getchar(); fgets(st.no,NOLEN,stdin);*/ printf("input name>"); getchar(); fgets(st.name,NAMELEN,stdin); printf("input age>"); scanf("%d",&st.age); printf("continue?(y/n)"); scanf("%s",&s); return st; }; void output_data(struct gakuseki g){ printf("----------------------------------\n"); printf("student number : %s\n",g.no); printf("name : %s\n",g.name); printf("age : %d\n",g.age); }; int main(){ int i,j; struct gakuseki stud; for(i=0;i<3;i++){ /* struct gakuseki stud;*/ stud=input_data(); if(s=='n') { break; }; }; output_data(stud); };

  • scanfの\nの意味

    タイトルの通りです。 #include<stdio.h> struct Person{ char name[100]; char gender; int age; }; int main(void) { struct Person person1; printf("名前は:"); scanf("%s",person1.name); printf("\n年齢は:"); scanf("%d",&person1.age); printf("\n性別は:"); scanf("\n%c",&person1.gender); printf("\n{name=%s,age=%d,gender=%c}",person1.name,person1.age,person1.gender); return 0; } 上記において aaa , 11 , M と入力すると {name=aaa,age=11,gender=M} と表示されますが、 scanf("\n%c",&person1.gender); を scanf("%c",&person1.gender); に変えると {name=aaa,age=11,gender= } となってしまいます。 この理由と、/nの意味を教えてください。

専門家に質問してみよう