Почему мой массив транспонирован? - PullRequest
0 голосов
/ 02 мая 2018

Я хочу объявить двумерный массив значений типа double (double** data). Я хочу передать это по адресу вспомогательной функции; поэтому я передаю &data и вспомогательная функция имеет аргумент double*** d.

При таком способе индексирование, которое я использовал для двумерного массива в основной функции, больше не работает.

Тестовый код:

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

void helperfunction(double*** data, int n, int c) {

    printf("\nIn helper function\n");

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < c; j++) {
            printf("(%i %i %lf) ", i, j, *data[i][j]);
        }
        printf("\n");
    }

}

int main(int argc, char **argv) {

    int n = 4; //number of rows
    int c = 4; //number of columns

    double count = 0.0;

    double** data = malloc(n * sizeof(double*));

    for (int i = 0; i < n; i++) {
        double* row = malloc(c * sizeof(double));
        for (int j = 0; j < c; j++) {
            row[j] = count;
            count += 1.2;
        }
        data[i] = row;
    }

    printf("In main function\n");

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < c; j++) {
            printf("(%i %i %lf) ", i, j, data[i][j]);
        }
        printf("\n");
    }

    helperfunction(&data, n, c);

    return 0;
}

Выход:

In main function
(0 0 0.000000) (0 1 1.200000) (0 2 2.400000) (0 3 3.600000) 
(1 0 4.800000) (1 1 6.000000) (1 2 7.200000) (1 3 8.400000) 
(2 0 9.600000) (2 1 10.800000) (2 2 12.000000) (2 3 13.200000) 
(3 0 14.400000) (3 1 15.600000) (3 2 16.800000) (3 3 18.000000) 

In helper function
(0 0 0.000000) (0 1 4.800000) (0 2 9.600000) (0 3 14.400000) 
Segmentation fault (core dumped)

Очевидно, что с индексированием что-то не так, когда я обращаюсь к адресу (*data[i][j]) в вспомогательной функции. Что вызывает это?

Ответы [ 2 ]

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

Извините, только что понял это. Разыменование с использованием [] происходит до разыменования с использованием *. Поэтому вызов *data[i][j] вызовет ошибку сегментации, когда i! = 0, поскольку указатель самого высокого уровня указывает только на одну вещь, а два указателя уровня любовника указывают на массивы.

Решение состоит в том, чтобы использовать data[0][i][j] вместо этого.

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

*data[i][j] не делает то, что вы думаете. Это эквивалентно *(data[i][j]). Ваши варианты:

  1. Используйте взамен (*data)[i][j] или

  2. Передайте data (вместо &data) и используйте data[i][j], поскольку здесь не требуется пропускать тройной указатель.

...