0

私は次のように2つの配列を持っています-

int **data; 
int ***count; 

いくつかの分析を実行した後、私は次の割り当てを行いたいです-

count[i][j][k] = data[i][j];

しかし、私はいくつかのポインタ割り当ての問題に関連していると思うセグメンテーション違反を繰り返し発生します-誰かが私がこの割り当てを行う方法を提案できますか?

--data [i] [j]=0/1/2の一般的な値。

ZALLOCの定義:

#define ZALLOC(item,n,type)      if ((item = (type *)calloc((n),sizeof(type))) == NULL)    fatalx("Unable to allocate %d unit(s) for item\n",n)

// memory assignment
int **data; 
int nrow, ncol; 

ZALLOC(data, ncol, int *);

for (index = 0; index < ncol; index++)
{
    ZALLOC(data[index], nrow, int);
}

int g=0, index1=0, index2=2;
data[index1][index2] = g;


int ***count;
int dim1 = 100, dim2 = 1, dim3=2;
ZALLOC(count, dim1, int **);

for (i = 0; i < dim1; i++)
{
ZALLOC(count[i], dim2, int *);
for (j = 0; j < dim2; j++)
{
ZALLOC(count[i][j], dim3, int);
}
}

// Initialize
for (i = 0; i < dim1; i++)
{
    for (j = 0; j < dim2; j++)
{
    for (k = 0; k < dim3; k++)
    {
        count[i][j][k] = 0;
    }
}
}
// Assignment
count[0][1][2] = data[1][2];
4

1 に答える 1

3

割り当ての構成は少し奇妙です。3つのディメンション(レベル、行、列と呼びます)がある場合、通常はレベルを保持するためのスペースを割り当て、次に各レベルにレベル内の行にスペースを割り当て、最後に割り当てます行内の列のスペース。

あなたのコードは真ん中(行)から始まっているようです。次に、レベルでいくつかの作業を行います。そして最後に列で。

このコードはあなたのコードを完全に書き直したものですが、クラッシュすることなく機能します。私はまだそれをvalgrind;で検証していません。このマシンのバージョンをアップグレードする必要があります。

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

#define ZALLOC(item, n, type) if ((item = (type *)calloc((n), sizeof(type))) == NULL) \
                                  fatalx("Unable to allocate %d unit(s) for item\n", n)

static void fatalx(const char *str, size_t n)
{
    fprintf(stderr, "%s: %zu\n", str, n);
    exit(1);
}

static int ***alloc_3d(int levels, int rows, int cols)
{
    int count = 0;
    int ***array_3d;
    ZALLOC(array_3d, levels, int **);
    for (int i = 0; i < levels; i++)
    {
        int **data;
        ZALLOC(data, rows, int *);
        array_3d[i] = data;
        for (int j = 0; j < rows; j++)
        {
            int *entries;
            ZALLOC(entries, cols, int);
            array_3d[i][j] = entries;
            for (int k = 0; k < cols; k++)
            {
                array_3d[i][j][k] = count++;
            }
        }
    }
    return array_3d;
}

static void print_3d(int ***a3d, int levels, int rows, int cols)
{
    for (int i = 0; i < levels; i++)
    {
        printf("%d:\n", i);
        for (int j = 0; j < rows; j++)
        {
            printf("   %d:  ", j);
            for (int k = 0; k < cols; k++)
                printf(" %3d", a3d[i][j][k]);
            putchar('\n');
        }
    }
}

static void free_3d(int ***a3d, int levels, int rows)
{
    for (int i = 0; i < levels; i++)
    {
        for (int j = 0; j < rows; j++)
            free(a3d[i][j]);
        free(a3d[i]);
    }
    free(a3d);
}

int main(void)
{
    int d1 = 3;
    int d2 = 5;
    int d3 = 7;
    int ***a3d = alloc_3d(d1, d2, d3);

    print_3d(a3d, d1, d2, d3);
    free_3d(a3d, d1, d2);

    return(0);
}

出力:

0:
   0:     0   1   2   3   4   5   6
   1:     7   8   9  10  11  12  13
   2:    14  15  16  17  18  19  20
   3:    21  22  23  24  25  26  27
   4:    28  29  30  31  32  33  34
1:
   0:    35  36  37  38  39  40  41
   1:    42  43  44  45  46  47  48
   2:    49  50  51  52  53  54  55
   3:    56  57  58  59  60  61  62
   4:    63  64  65  66  67  68  69
2:
   0:    70  71  72  73  74  75  76
   1:    77  78  79  80  81  82  83
   2:    84  85  86  87  88  89  90
   3:    91  92  93  94  95  96  97
   4:    98  99 100 101 102 103 104
于 2013-02-25T05:28:41.993 に答える