ポインタの動的確保について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kgaghaiohti
記事: 1
登録日時: 8年前

ポインタの動的確保について

#1

投稿記事 by kgaghaiohti » 8年前

二次元配列をつかい、mallocを使い、以下の条件で記したメモリ領域を確保するプログラムを作成せよ。という問題がわかりません。。。
array[m][n]
一行目・・・8列
二行目・・・4列
三行目・・・3列
四行目・・・6列
各領域はfloat型を格納できるものとする

metaphor

Re: ポインタの動的確保について

#2

投稿記事 by metaphor » 8年前

いろんな方法があると思いますがおそらく最も基本的なやり方と思われる方法は
int main( int argc, char **argv )
{
}
みたいにfloat **matrix;ダブルポインタまたはfloat *matrix[];で作ります。
まず一次元配列 float* matrixではどうmallocを習われました。

metaphor

Re: ポインタの動的確保について

#3

投稿記事 by metaphor » 8年前

一応3つ思い着いた中で一つ書いておきます。十分検証したつもりですが2次元配列とポインターは文法が乱れてる(読んでる本に書いてあります..)とこらしいので再度検証をして下さい。”四行目・・・6列”は省略してあります。

コード:

#include <stdio.h>
#include <stdlib.h>
int main(void) {
	//割り振られた領域のアドレスを格納するためのfloat型のポインタfpを宣言
	float *fp[3]; //Cの宣言では[] は* よりも優先順位が高い。ゆえにfloat *fp[2]; 
				 //という宣言はfloatへのポインタの配列を意味する(逆みたいですが)
	int n1 = 8; //確保する要素数を入力
	int n2 = 4;
	int n3 = 3;
	int i;
	float delta = 1000.0f / 60.0f;//delta(Time)
	fp[0] = (float *)malloc(n1 * sizeof(float));       //メモリ領域の確保
	fp[1] = (float *)malloc(n2 * sizeof(float));      //メモリ領域の確保
	fp[2] = (float *)malloc(n3 * sizeof(float));     //メモリ領域の確保
	for (i = 0; i<n1; i++) { *(fp[0] + i) = delta * i; } // データ格納
	for (i = 0; i<n1; i++) { printf("%f ", fp[0][i]); }// データ表示
	printf("\n\n");
	for (i = 0; i<n2; i++) { *(fp[1] + i) = delta * i; } // データ格納
	for (i = 0; i<n2; i++) { printf("%f ", fp[1][i]); } // データ表示
	printf("\n\n");
	for (i = 0; i<n3; i++) { *(fp[2] + i) = delta * i; } // データ格納
	for (i = 0; i<n3; i++) { printf("%f ", fp[2][i]); } // データ表示
	free(fp[0]); //確保したメモリ領域の解放::この場合プログラムが終了するので不要
	free(fp[1]); //確保したメモリ領域の解放::この場合プログラムが終了するので不要
	free(fp[2]); //確保したメモリ領域の解放::この場合プログラムが終了するので不要
	printf("\n\n");
	return 0;
}
(計算部分はゲームに関係する数値を計算してるので書き換えてください。間違っているかも知れません。)

かずま

Re: ポインタの動的確保について

#4

投稿記事 by かずま » 8年前

列のサイズの異なるメモリ領域を無駄なく確保して、
二次元配列のように使えるものです。

コード:

#include <stdio.h>
 
int main(void)
{
    enum { N0 = 8, N1 = 4, N2 = 3, N3 = 6 };
    float m[N0 + N1 + N2 + N3];
    float *array[4] = { m, array[0] + N0, array[1] + N1, array[2] + N2 };

    for (int i = 0; i < N0; i++) printf(" %p", &array[0][i]); putchar('\n');
    for (int i = 0; i < N1; i++) printf(" %p", &array[1][i]); putchar('\n');
    for (int i = 0; i < N2; i++) printf(" %p", &array[2][i]); putchar('\n');
    for (int i = 0; i < N3; i++) printf(" %p", &array[3][i]); putchar('\n');
    return 0;
}
二次元配列も、malloc も使っていないので、解答ではありませんが。

Math

Re: ポインタの動的確保について

#5

投稿記事 by Math » 8年前

この様に書き換えれば正解になると思います。

コード:

#include <stdio.h>
#include <stdlib.h> 
int main(void)
{
    enum { N0 = 8, N1 = 4, N2 = 3, N3 = 6 };
    float *m; //float m[N0 + N1 + N2 + N3];
	float *array[4];//配列の配列
	int i;
    m = malloc(sizeof(float) * (N0 + N1 + N2 + N3));//メモリ領域の確保
    array[0]=m; array[1]=array[0] + N0; array[2]=array[1] + N1; array[3]=array[2] + N2;
    //array[4] = { m, array[0] + N0, array[1] + N1, array[2] + N2 };
    for (i = 0; i < N0; i++) printf(" %p", &array[0][i]); putchar('\n');//2次元配列(=配列の配列)
    for (i = 0; i < N1; i++) printf(" %p", &array[1][i]); putchar('\n');//2次元配列(=配列の配列)
    for (i = 0; i < N2; i++) printf(" %p", &array[2][i]); putchar('\n');//2次元配列(=配列の配列)
    for (i = 0; i < N3; i++) printf(" %p", &array[3][i]); putchar('\n');//2次元配列(=配列の配列)
    return 0;
}

閉鎖

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