在C中为3d数组赋值

时间:2013-02-25 03:48:59

标签: c

我有2个数组如下 -

int **data; 
int ***count; 

运行一些分析后,我想做以下任务 -

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

但是,我一直在收到Segmentation fault,我认为这与一些指针赋值问题有关 - 有人可以建议我如何进行这项任务吗?

典型值 -     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];

1 个答案:

答案 0 :(得分: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