[an error occurred while processing this directive]
[an error occurred while processing this directive]struct student { int id; char *name; };idとnameは構造体のメンバ(member)と呼ばれます。これはmain()の中ではなくて、#include
#includehogeという実体を作って、これに"."で区切って値を代入しています。struct student { int id; char *name; }; int main(void){ struct student hoge; hoge.id = 0; hoge.name = "Kei"; printf("%d: %s", hoge.id, hoge.name); }
int main(void){ struct student hoge, *hogep; hogep = &hoge; // hogepにhogeのアドレスを代入 hogep->id = 0; hogep->name = "Kei"; printf("%d: %s", hoge->id, hoge->name); }hogepを使ってアクセスする時は、"->"を使ってアクセスします。
struct student { int id; char *name; };のかわりに
typedef struct { int id; char *name; } student, *student_t;と書くと、
struct student hoge; struct student *hogep;と書く代わりに
student hoge; student_t hogep;とかけるようになります。
struct student { int id; char *name; };一番基本は、こんな感じです。
struct student mk_student(int id, char *name){ struct student s; s.id = id; s.name = name; return s; }こういう関数を作ると、別の関数(例えばmain())で次のような呼び出しが出来ます。
int main(void){ struct student s0; ... s0 = mk_student(1, "kei");こうすると、s0が(1, "kei")というデータが入った構造体になります。
struct student *mk_student(int id, char *name){ struct student s; s.id = id; s.name = name; return &s; }&s は、student構造体のsへのポインタ(アドレス)です。これで、
int main(void){ struct student *sp0; ... sp0 = mk_student(1, "kei"); printf("id = %d, name = %s\n", sp0->id, sp0->name);と書いてはどうでしょうか?
char *cp = malloc(サイズ);で、サイズ分のメモリが返ってきます。intの長さ10の配列が欲しければ、
int *A; A = (int *)malloc(sizeof(int) * 10);と書くとOKです。
struct student *mk_student(int id, char *name){ struct student *sp; sp = (struct student*)malloc(sizeof(struct student)); sp->id = id; sp->name = name; return sp; }こう書いた上で、
int main(void){ struct student *sp0; ... sp0 = mk_student(1, "kei"); printf("id = %d, name = %s\n", sp0->id, sp0->name);とすると、今度はいつも正しくsp0に構造体へのポインタが返ってきます。