Получить указатель на столбец 2D массива в C - PullRequest
0 голосов
/ 17 апреля 2020

Я новичок в C программировании и особенно в указателях. В написанной мной программе я попытался написать функцию, которая возвращает указатель на указанный столбец массива. Смотрите код ниже для лучшего понимания (или путаницы :)):

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

// function for getting pointer to specidifed column index
// 'ind' is index of requested column, 'ncol' is number of items in column
int* get_col(const int* arr, unsigned int ind, unsigned int ncol);

int main() {
    unsigned int n;

    printf("Input matrix size : ");
    scanf("%i", &n);

    int arr[n][n];

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            arr[i][j] = i * n + j;
    }

    for (int i = 0; i < n; i++) {
        printf("values in column %d: \n", i);
        int *col = get_col((int*)arr, i, n);
        for (int j = 0; j < n; j++) {
            printf("%d ", *col);
            col = col + 1;
        }
        printf("\n");
    }

    return 0;
}

int* get_col(const int* arr, unsigned int ind, unsigned int ncol) {
    int *result = malloc(sizeof(int) * ncol);

    for (int i = 0; i < ncol; i++)
        *result = *(arr + i*ncol + ind);

    return result;
}

Как видите, get_col функция принимает указатель на массив, индекс столбца и размер столбца (n элементов в столбце, то есть количество Строки) в качестве аргументов и пытается вернуть указатель на одномерный массив, который содержит значения столбца по запрошенному индексу. Проблема в том, что результат не является правильным. В случае, если n=3 результаты похожи на приведенные ниже:

Input matrix size : 3
values in column 0: 
6 0 0 // supposed to be 0 3 6
values in column 1: 
7 0 0 // supposed to be 1 4 7
values in column 2: 
8 0 0 // supposed to be 2 5 8

Я думаю, что проблема заключается в моем понимании указателей, а не реализованного алгоритма. На самом деле, сначала я не использовал указатель в моей функции get_col, как показано ниже:

int result[ncol];

// ... do my work here to populate array

return &result;

Затем, когда компилятор жалуется warning: function returns address of local variable [-Wreturn-local-addr], я преобразовал result из массива в указатель в функции get_col как выше. В чем проблема в этом коде? Я использовал указатели в функции get_col, как и должно быть?

1 Ответ

1 голос
/ 17 апреля 2020

В следующей строке:

*result = *(arr + i*ncol + ind);

Вы всегда пишете на один и тот же адрес памяти.

Измените его на один из двух следующих параметров:

*(result + i) = *(arr + i*ncol + ind);
result[i] = *(arr + i*ncol + ind);

Относительно вашей второй проблемы, когда вы использовали:

int result[ncol];

// ... do my work here to populate array

return &result;

Вы должны понимать, что переменная result в этом случае (stati c -напределение памяти) хранится в стеке. Итак, после того, как ваша функция вернулась, значения переменных больше не существуют в памяти. Вот почему вам нужно динамическое распределение памяти. При динамическом распределении памяти c эти значения остаются в памяти до тех пор, пока вы не вызовете free самостоятельно.

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