掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28545

2次元配列の動的確保
投稿者---asc(2006/10/22 01:49:03)


ちょっと悩んでいるので、皆様にご指導していただきたいのですがよろしいでしょうか?

2次元配列の動的確保がわからない所存です。
1次元の場合は

int *data;
data = (int *)malloc(N * sizeof(int));

と、理解しているのですが、2次元の場合どうすればいいのか悩んでおります。

要するに2次元配列は1次元配列の要素の配列なので、

int **data;

と、するところまではわかったのですが、これ以降どうしていいのかがわかりません。

どなたがご教授いただけないでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:2次元配列の動的確保 28546 かずま 2006/10/22 02:35:48
<子記事> Re:2次元配列の動的確保 28547 επιστημη 2006/10/22 02:45:45
<子記事> Re:2次元配列の動的確保 28548 たかぎ 2006/10/22 11:17:38


No.28546

Re:2次元配列の動的確保
投稿者---かずま(2006/10/22 02:35:48)


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

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

int main(void)
{
    int m = 4, n = 3, 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.28547

Re:2次元配列の動的確保
投稿者---επιστημη(2006/10/22 02:45:45)
http://blogs.wankuma.com/episteme/


/*
 * あくまで一例。鵜呑みにするべからず。
 */

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

int** allocate(int M, int N) {
  int** result;
  int* p;
  int i;
  p = (int*)malloc(M*N*sizeof(int));
  assert(p);
  result = (int**)malloc(M*sizeof(int*));
  assert(result);
  for ( i = 0; i < M; ++i ) {
    result[i] = p;
    p += N;
  }
  return result;
}

void deallocate(int** data) {
  free(data[0]);
  free(data);
}

int main() {
  int x, y;
  int** data = allocate(2,3);
  for ( x = 0; x < 2; ++x ) {
    for ( y = 0; y < 3; ++y ) {
      data[x][y] = x+y;
    }
  }
  for ( x = 0; x < 2; ++x ) {
    for ( y = 0; y < 3; ++y ) {
      printf("%d+%d=%d  ", x, y, data[x][y]);
    }
    printf("\n");
  }
  deallocate(data);
  return 0;
}



この投稿にコメントする

削除パスワード

No.28548

Re:2次元配列の動的確保
投稿者---たかぎ(2006/10/22 11:17:38)
http://takagi.in/


>要するに2次元配列は1次元配列の要素の配列なので、
>
>int **data;

この部分の理解が浅いかも。

1次元配列を要素とする配列ということであれば、int[N]型の配列を作る場合、

int (*data)[N];

とすべきです。そして、

data = malloc(sizeof(int[M][N]));

としてやれば、2次元配列を動的に割付けることができます。
MやNを可変にするのであれば、ポインタを要素とする配列にする必要がありますね。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧