電脳ミツバチのコンピュータ広報室

銀座の屋上菜園を耕しています。コンピュータ畑も耕します。

②構造体の初期化

構造体は初期化することが出来る。
例えば一度に全て0を入れたい場合、memset関数を使う。

#ifndef KOUZOUTAI_H
#define KOUZOUTAI_H
typedef struct p_kouzoutai
{
	char *a;
	char *b;
	char *c;
}POINT;
typedef struct a_kouzoutai
{
	char a[10];
	char b[10];
	char c[10];
}ARRAY;

#endif
#include<stdio.h>
#include "kouzoutai.h"
main()
{
	POINT syokika;
	memset(&syokika,'\0',sizeof(syokika));
	printf("syokika.a=%s\tsyokika.b=%s\tsyokika.c=%s\n",syokika.a,syokika.b,syokika.c);
}

結果	
syokika.a=(null)        syokika.b=(null)        syokika.c=(null)

memset関数は

#include <string.h>
void *memset(void *s, int c, size_t n);

と定義され先頭からnバイトまでをint cで埋める関数なのでコンパイラによっては0がnullで無いものもある。
よって移植性重視のプログラムではmemset関数を使うのは避けたほうがよい。

宣言時に初期化するのは感覚で分かるとおりである。

#include<stdio.h>
#include<string.h>
#include "kouzoutai.h"
main()
{
	POINT syokika={"name","住所","03-XXXX-XXXX"};
	printf("syokika.a=%s\tsyokika.b=%s\tsyokika.c=%s\n",syokika.a,syokika.b,syokika.c);
}

結果
syokika.a=name  syokika.b=住所  syokika.c=03-XXXX-XXXX

②構造体自体をポインタで扱う

構造体をmallocして動的に確保したい。
こんなときも多いだろうがとりあえず書き方として

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "kouzoutai.h"

main()
{
	POINT *p_memallocate;
	p_memallocate=malloc(sizeof(struct p_kouzoutai));
	p_memallocate->a=strdup("testa");
	p_memallocate->b=strdup("testb");
	printf("%s\t%s\n",p_memallocate->a,p_memallocate->b);

}
結果
testa   testb

ここで->(アロー演算子)を使っているが別に使わなくてもよい。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "kouzoutai.h"

main()
{
	POINT *p_memallocate;
	p_memallocate=malloc(sizeof(struct p_kouzoutai));
	(*p_memallocate).a=strdup("testa");
	(*p_memallocate).b=strdup("testb");
	printf("%s\t%s\n",p_memallocate->a,p_memallocate->b);

}

代入時だけ戻してみた。
こんなことも出来る。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "kouzoutai.h"

main()
{
	POINT *p_memallocate;
	p_memallocate=malloc(sizeof(struct p_kouzoutai)*2);
	(p_memallocate+1)->a=strdup("testa");
	(*p_memallocate).b=strdup("testb");
	printf("%s\t%s\n",(p_memallocate+1)->a,p_memallocate->b);

}
結果
testa   teatb

ポインタの加算である。(mallocは二倍分取った)

*(p+1)はp[1]のようにも扱えたことより、配列のようにすることも出来る。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "kouzoutai.h"

main()
{
	POINT *p_memallocate;
	p_memallocate=malloc(sizeof(struct p_kouzoutai)*3);
	p_memallocate[1].a=strdup("testa");
	(p_memallocate+1)->b=strdup("testb");
	printf("%s\t%s\n",p_memallocate[1].a,(p_memallocate+1)->b);

}
	
結果
testa  testb


ポインタ*(p+1)
構造体(p+1)->a
配列p[1]構造体p[1].a
もちろんポインタの構造体で(p+1)->aを(*(p+1)).aとも書ける。(普通書かないが)
ポインタと配列の関係が理解していればおのずと構造体の方もイメージできるはず。
後はこれらを組み合わせた応用である。

最後に構造体同士を比較することは出来ない。