構造体とポインタに関する質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tak2929

構造体とポインタに関する質問

#1

投稿記事 by tak2929 » 10年前

構造体に関して質問です。
下記ソース43行目InputPeople関数の引数は構造体のポインタ、54行目ShowPeople関数の引数は構造体になっています。
①main関数内では、17行目で構造体のポインタとして定義したdataをShowPeople関数の引数に用いており、ShowPeople関数の引数定義と異なるのに下記プログラムがNGでない理由がよく理解できません。また、②InputPeople(&data)としていますが、dataはポインタとして定義しているのでInputPeople(data)だと考えたのですが、これだとNGとなる理由がよくわかりません。
①、②に関しまして、どなたか詳しいかた御回答頂けないでしょうか。よろしくお願いします。

コード:

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

typedef struct {
	char name[256];
	int age;
	int sex;
} People;

void InputPeople(People *data);
void ShowPeople(People data);

int main(void)
{
	int i,count,datasize;
	People *data;
	
	datasize = 10;
	data = (People*)malloc(sizeof(People) * datasize);
	
	count = 0;
	while (1) {
		InputPeople(&data[count]);
		if (data[count].age == -1) break;
		count++;
		
		if (count >= datasize) {
			datasize += 10;
			data = (People*)realloc(data,sizeof(People) * datasize);
		}
	}
	
	for (i = 0;i < count;i++) {
		ShowPeople(data[i]);
	}

	free(data);
	
	return 0;
}

void InputPeople(People *data)
{
	printf("名前:");
	scanf("%s",data->name);
	printf("年齢:");
	scanf("%d",&data->age);
	printf("性別(1-男性、2-女性):");
	scanf("%d",&data->sex);
	printf("\n");
}

void ShowPeople(People data)
{
	char sex[16];
	
	printf("名前:%s\n",data.name);
	printf("年齢:%d\n",data.age);
	
	if (data.sex == 1) {
		strcpy(sex,"男性");
	} else {
		strcpy(sex,"女性");
	}
	
	printf("性別:%s\n",sex);
	printf("\n");
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 構造体とポインタに関する質問

#2

投稿記事 by みけCAT » 10年前

tak2929 さんが書きました:①main関数内では、17行目で構造体のポインタとして定義したdataをShowPeople関数の引数に用いており、ShowPeople関数の引数定義と異なるのに下記プログラムがNGでない理由がよく理解できません。
35行目のdataは*((data)+(i))と等価であり、(data)+(i)はdataのi個先のPeople型のデータへのポインタ、*((data)+(i))はそのポインタが指しているPeople型のデータになるので、
ShowPeople関数の引数と型が一致します。
(詳細はN3337の5.2.1 Subscripting、5.3.1 Unary operators、5.7 Additive operatorsを参照してください)
また、ここ以外にShowPeople関数を呼び出している場所は見当たりません。

tak2929 さんが書きました:②InputPeople(&data)としていますが、dataはポインタとして定義しているのでInputPeople(data)だと考えたのですが、これだとNGとなる理由がよくわかりません。

InputPeople(&data[count])という場所はありますが、InputPeople(&data)としている場所は見当たりません。
また、この場所をInputPeople(data)としても、コンパイルが通りました。

コードと質問文が合っていないようです。貼るコードを間違えていないか確認してください。

オフトピック
People構造体には1人分のデータしか格納しないようなので、PeopleではなくPersonにするべきである気がしました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: 構造体とポインタに関する質問

#3

投稿記事 by box » 10年前

tak2929 さんが書きました: ①main関数内では、17行目で構造体のポインタとして定義したdataをShowPeople関数の引数に用いており、
ShowPeople関数の引数定義と異なるのに下記プログラムがNGでない理由がよく理解できません。
本当ですか?dataのように見えます。
main関数において、dataはPeople型へのポインターです。dataはPeople型です。
何もおかしくないように見えます。

tak2929 さんが書きました: また、②InputPeople(&data)としていますが、

本当ですか?&data[count]のように見えます。
data[count]はPeople型です。&data[count]はPeople型へのポインターです。
何もおかしくないように見えます。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 14年前

Re: 構造体とポインタに関する質問

#4

投稿記事 by box » 10年前

構造体とポインター
のかわりに
int型とポインター
と問題を単純化してみてはどうでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る