Попытка выделить непрерывный блок памяти и получить к нему доступ, используя 3 индекса, но мой метод segfaults - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь написать процедуру, которая позволит мне выделить непрерывный блок памяти размером n1 * n2 * n3 и получить к нему доступ с использованием 3 индексов, как если бы вы использовали массив

int array[n1][n2][n3];

У меня естьуспешно (насколько я могу судить) удалось это с двумя индексами (см. мой пример ниже)

#include <stdlib.h>

int main() {

    // Dimensions
    const int n1 = 2;
    const int n2 = 2;

    int **array;

    // Pointers
    array = (int **)malloc(n1*sizeof(int *));

    // Contiguous chunk of memory of size n1xn2
    array[0] = (int *)malloc(n1*n2*sizeof(int));

    // Pointer arithmetic
    for(int i=0;i<n1;i++) {
        array[i] = array[0] + i*n2;
    }

    array[0][0] = 1;

    return EXIT_SUCCESS;
}

Но когда я пытаюсь подобную конструкцию с тремя индексами, моя процедура выдает segfault:

#include <stdlib.h>

int main() {

    // Dimensions
    const int n1 = 2;
    const int n2 = 2;
    const int n3 = 2;

    int ***array;

    // Pointers
    array = (int ***)malloc(n1*sizeof(int **));
    array[0] = (int **)malloc(n1*n2*sizeof(int *));

    // Contiguous chunk of memory of size n1xn2xn3
    array[0][0] = (int *)malloc(n1*n2*n3*sizeof(int));

    // Pointer arithmetic
    for(int i=0;i<n1;i++) {
        for(int j=0;j<n2;j++) {
            array[i][j] = array[0][0] + i*n2*n3 + j*n2;
        }
    }

    array[0][0][0] = 1;

    return EXIT_SUCCESS;
}

Я понимаю, что есть и другие способы управления непрерывным блоком памяти.Меня особенно интересует, почему моя логика не работает в приведенном выше случае.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Возможно, вам не хватает

array[i] = array[0] + i*n2;

Вот ваш код

#include <stdlib.h>

int main() {

    // Dimensions
    const int n1 = 2;
    const int n2 = 2;
    const int n3 = 2;

    int ***array;

    // Pointers
    array = (int ***)malloc(n1*sizeof(int **));
    array[0] = (int **)malloc(n1*n2*sizeof(int *));

    // Contiguous chunk of memory of size n1xn2xn3
    array[0][0] = (int *)malloc(n1*n2*n3*sizeof(int));

    // Pointer arithmetic
    for(int i=0;i<n1;i++) {
        array[i] = array[0] + i*n2;
        for(int j=0;j<n2;j++) {
            array[i][j] = array[0][0] + i*n2*n3 + j*n2;
        }
    }

    array[0][0][0] = 1;

    return EXIT_SUCCESS;
}
0 голосов
/ 23 мая 2018

Выделение памяти для 3D-массива.Может быть, я сделал что-то не так, но, похоже, все в порядке.

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

int
main () {
 int n1 = 2;
 int n2 = 3;
 int n3 = 4;
 int i, j;

 int ***array;

 array = malloc(n1 * sizeof(int**));

 for (i = 0; i < n1; i++)
    array[i] = malloc(n2 * sizeof(int*));

 for (i = 0; i < n1; i++)
 for (j = 0; j < n2; j++)
    array[i][j] = malloc(n3 * sizeof(int));


 array[1][2][3] = 15000;
 printf("%d\n", array[1][2][3]);

return 0;
}
...