C言語関係掲示板

過去ログ

No671 2次元配列をmallocを使って動的に確保したい

[戻る] [ホームページ]
No.7475

2次元配列を動的に
投稿者---ともひろ(2003/06/18 01:54:10)


2次元配列をどちらもmallocを使って動的に確保したいのですが、
わかりません。どなたか教えてください。

a[m][n]
mとnの大きさを確保したい

No.7477

Re:2次元配列を動的に
投稿者---とおりすがり(2003/06/18 02:08:00)


>2次元配列をどちらもmallocを使って動的に確保したいのですが、

>mとnの大きさを確保したい

"どちらも"とは?
2次元配列はmとnの2つの配列ではありません。m*n個分の領域ですが。
その辺をどうしたいのか、はっきりさせるべきかと。


この投稿にコメントする

削除パスワード

No.7478

2次元配列を動的に
投稿者---ともひろ(2003/06/18 02:15:54)


>>2次元配列をどちらもmallocを使って動的に確保したいのですが、
>…
>>mとnの大きさを確保したい
>
>"どちらも"とは?
>2次元配列はmとnの2つの配列ではありません。m*n個分の領域ですが。
>その辺をどうしたいのか、はっきりさせるべきかと。

始めにmだけを確保して、そのあとにi(0 〜 m-1)にそれぞれ違った大きさを
確保したいです

No.7483

Re:2次元配列を動的に
投稿者---YuO(2003/06/18 06:50:14)


>>>2次元配列をどちらもmallocを使って動的に確保したいのですが、
>>…
>>>mとnの大きさを確保したい
>始めにmだけを確保して、そのあとにi(0 〜 m-1)にそれぞれ違った大きさを
>確保したいです

根本的にはFAQです。
http://www.catnet.ne.jp/kouno/c_faq/c6.html#16
これはnが固定ですが,最初のコード片の意味が分かれば,
段違いの2次元配列を作成することも難しくないでしょう。

pointer周辺とmalloc周辺を理解していれば,
上記サイトのコード片も簡単に読めます。


No.7487

Re:2次元配列を動的に
投稿者--- (2003/06/18 10:55:59)


>始めにmだけを確保して、そのあとにi(0 〜 m-1)にそれぞれ違った大きさを
>確保したいです

よもやそれは2次元配列とは言えません。
1次元のポインタ配列の各要素に、
1次元の配列の先頭ポインタを格納しリンクさせる、
と言うものがご希望の処理になるでしょう。

「配列」とは何か?から勉強し直すべきでしょう。

No.7480

Re:2次元配列を動的に
投稿者---かずま(2003/06/18 02:27:07)


> a[m][n]
> mとnの大きさを確保したい
a(i,j) で参照してもいいのなら簡単です。

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

int main(void)
{
    int m = 3, n = 4, i, j;
    int *a_ = malloc(m * n * sizeof(int));

    if (a_ == NULL) return puts("out of memory"), 1;
    #define a(i, j)  a_[i * n + j]

    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++)
            printf(" &a(%d,%d)=%p", i, j, &a(i, j));
        printf("\n");
    }

    #undef a
    free(a_);
    return 0;
}
 
a[i][j] で参照したいのなら、

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

void *alloc2d(size_t m, size_t n, size_t s)
{
    size_t i, j = (m + 1) & ~1;
    char **p = malloc(j * sizeof(void *) + m * (s *= n));
    if (p) {
        p[0] = (char *)(p + j);
        for (i = 1; i < n; i++)
            p[i] = p[i-1] + s;
    }
    return p;
}

int main(void)
{
    int m = 3, n = 4, i, j;
    int **a = alloc2d(m, n, sizeof(int));

    if (a == NULL) return puts("out of memory"), 1;

    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++)
            printf(" &a[%d][%d]=%p", i, j, &a[i][j]);
        printf("\n");
    }

    free(a);
    return 0;
}


No.7482

Re:2次元配列を動的に
投稿者---ともひろ(2003/06/18 02:46:23)


>> a[m][n]
>> mとnの大きさを確保したい

できれば始めにmだけを確保して、そのあとにi(0 〜 m-1)に
それぞれ違った大きさを確保したいです。
どのようにしたらいいでしょうか?

No.7490

Re:2次元配列を動的に
投稿者---かずま(2003/06/18 11:08:00)


>       for (i = 1; i < n; i++)
>           p[i] = p[i-1] + s;

訂正です。

        for (i = 1; i < m; i++)
            p[i] = p[i-1] + s;