Я новичок в 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
, как и должно быть?