Трехмерный массив с malloc и calloc? - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь договориться с 3-мерной динамической памятью, мой код выглядит следующим образом:

typedef unsigned char matrix;

matrix ***mat(int n, int b)
{
    matrix ***temp = (matrix ***)malloc(n*sizeof(matrix**));
    for(int i=0; i<n; i++)
    {
        temp[i] = (matrix **)malloc(b*sizeof(matrix *));
        for(int j = 0; j < b; j++)
            temp[i][j]= (matrix *)malloc(b*sizeof(matrix));
    }
    return temp;
}
int main()
{ 
    matrix ***M2 = mat(3,2);
    for(int i=0; i<3; i++)
    {
        for(int j=0; j<2; j++)
        {
            for(int k=0; k<2; k++)
            {
                printf(" %d", M2[i][j][k]);
            }
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}

когда я запускаю программу, у меня есть нарушение сегмента, кто-то может сказать мне, чтоошибка, так как я не могу визуализировать

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Вы должны исправить счетчик j внутри вложенного цикла for в функции mat, это правильное значение:
for(int j = 0; j < b; j++)

0 голосов
/ 25 января 2019

Обычно я делаю такие вещи в FORTRAN, лично мне нравится писать алгоритм, включающий в себя массив больших измерений в FORTRAN в качестве библиотеки, и выполнять управление потоками в C. Хотя 3D все еще легко управляем в C, вам нужно очень осторожно с указателями, вот рабочий пример, это valgrind clean.

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

float ***myarray(int l, int m, int n)
{
    float **ptr = malloc(sizeof(float*)*(l+l*m));
    float *data = malloc(sizeof(float)*l*m*n);
    float **p1 = ptr, **p2 = ptr+l;
    for(int i=0; i<l; i++) {
        p1[i] = (float*)(p2+i*m);
        for(int j=0; j<m; j++)
            p2[i*m+j] = data+(i*m+j)*n;
    }
    return (float***)ptr;
}

void myfree(float ***a)
{
    free(a[0][0]);
    free(a);
}

int main()
{
    float ***array = myarray(4,3,2);
    for(int i=0; i<4; i++)
        for(int j=0; j<3; j++)
            for(int k=0; k<2; k++)
                array[i][j][k] = i+j+k;
    myfree(array);
    return  0;
}
0 голосов
/ 25 января 2019

Я предполагаю, что в самом вложенном цикле for (j one) переменные путаются в объявлении for(int j = 0; i < b; i++).Попробуйте j для всех

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...