オブジェクトを動的に作成するプログラムについて

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

オブジェクトを動的に作成するプログラムについて

#1

投稿記事 by dust » 16年前

はじめまして
課題をやっておりまして、
(1) 二次元配列を動的に生成して、その配列に文字列"TOKYO"と"SAITAMA"を格納して表示する
(2)struct student構造体オブジェクトを要素とする一次元配列を動的に生成して、
その配列にメンバの値を格納して表示する

二つの条件を元にプログラムを作成しました

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

#define STR_LENGTH 2		//文字列の長さ
#define STR_NUMBER 2		//文字列の数
#define STR_NAME 6

//構造体を宣言する
struct student
{
	//名前、身長、体重を構造体オブジェクトのメンバに格納する関数の定義
	char name[STR_NAME];
	int  math;
	int eng;
	
};

//すべての文字列を一度に表示する関数の関数定義
void print_str(char *p)
{

	puts(p);
}

int main(void)
{
	int i,j;
	char (*a)[STR_NAME] = NULL;//確保される記憶域の先頭アドレスを格納するための配列を宣言・定義する

	struct student *b = NULL;//確保される記憶域の先頭アドレスを格納するための構造体を宣言・定義する
	
	a = malloc(STR_LENGTH * STR_NAME * sizeof(char));
	b = malloc(2 * sizeof(struct student));
	
	if(a == NULL) //本当に記憶域が確保できたかを確認する
	{
		puts("記憶域の確保に失敗しました");
		return NULL; //ここでプログラムを終了する
	}
	
	
	else if(b == NULL) //本当に記憶域が確保できたかを確認する
	{
		puts("記憶域の確保に失敗しました");
		return NULL; //ここでプログラムを終了する
	}
	
	strcpy(a[0],"TOKYO");
	strcpy(a[1],"SAITAMA");
	
	puts("各文字列を表示します")
	;
	for(i=0; i < STR_LENGTH; i++)
		print_str(&a[0]); //すべての文字列を出力する
		
	strcpy(b[0].name,"TANAKA");
	b[0].math=75;
	b[0].eng=60;
	
	strcpy(b[1].name,"YAMAMOTO");
	b[1].math=85;
	b[1].eng=90;
	
	puts("各生徒の成績を表示します");
	
	for (j=0; j < STR_NUMBER; j++)
		printf("Name: %s\nMath: %d\nEng:  %d\n",b[j].name,b[j].math,b[j].eng);
	
	
	free(a); //記憶域を解放して破棄する
	free(b); //記憶域を解放して破棄する
	
	return 0;
}


実行結果が出るのですがどうしても警告が残ってしまいます。

警告 W8004 222.c 31: 'b' に代入した値は使われていない(関数 main )
警告 W8004 222.c 29: 'a' に代入した値は使われていない(関数 main )

a の確保のしかたが違うような気がするのですが・・・・
警告を消すためにプログラムをどう改良すればいいのか
よろしくお願いします。

kazuoni

Re:オブジェクトを動的に作成するプログラムについて

#2

投稿記事 by kazuoni » 16年前

直接の原因は
ttp://oshiete1.goo.ne.jp/qa4796882.html
で回答されています。
(Borland C++ Compiler 5.5ではこのような警告がでるのですか^^;)
根本から解決するにはちょっと難しいような気がしますが・・・。

二次元配列動的確保っという題意を上のプログラムで満たしているかどうか微妙ですが、
以下の方法がよく参考書等では紹介されています。
char **x;
x=(char **)malloc(STR_NUMBER * sizeof(char *));
for(i=0 ; i<STR_NUMBER ; i++)
	x = (char *)malloc(STR_NAME * sizeof(char));


トピ主さんのプログラムが必然的に動いているのか、偶然なのか
がとても興味があるのですが^^;
(aの動的確保の際、どのようにキャストされているのか)

閉鎖

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