Функция, возвращающая указатель на массив
Мне удалось работать с массивами переменной длины вC
и теперь у меня есть следующее:
#include <stdio.h>
#include <stdlib.h>
int (*foo(size_t row, size_t col))[3];
int main(void){
size_t row, col;
printf("Give the ROW: ");
if ( scanf("%zu",&row) != 1){
printf("Error, scanf ROW\n");
exit(1);
}
printf("Give the COL: ");
if ( scanf("%zu",&col) != 1){
printf("Error, scanf COL\n");
exit(2);
}
int (*arr)[col] = foo(row, col);
for ( size_t i = 0; i < row; i++){
for( size_t j = 0; j < col; j++){
printf("%d ",*(*(arr+i)+j));
}
}
free(arr);
}
int (*foo(size_t row, size_t col))[3]{
int (*arr)[col] = malloc(row * col * sizeof(int));
int l=0;
if (arr == NULL){
printf("Error, malloc\n");
exit(3);
}
for ( size_t i = 0; i < row; i++){
for( size_t j = 0; j < col; j++){
*(*(arr+i)+j) = l;
l++;
}
}
return arr;
}
Выход:
Give the ROW: 2
Give the COL: 5
0 1 2 3 4 5 6 7 8 9
Теперь это:
int (*foo(size_t row, size_t col))[3]{ /* code */ }
означает, если я правильно понял, что объявляет foo как функцию с двумя параметрами (size_t row, size_t col), которая возвращает указатель на массив 3 из int.
Я не совсем способен понять такого рода функции, и теперь мне сложнее работать с массивами переменной длины, когда размер известен только во время выполнения, но я считаю это хорошей вещью. Я работаю только сC11
стандарт.
Любой способ здесьint (*foo(size_t row, size_t col))[3]
У меня есть [3], который мне не совсем понятен о том, как это работает и как я могу сделать это возможным во время выполнения (конечно, только если это возможно), что-то вродеint (*foo(size_t row, size_t col))[SIZE]
.
Я прочитал несколько книг оC
, но нет точных объяснений этой ситуации, и Google тоже не помогает, поэтому у меня есть два вопроса:
1) это возможноint (*foo(size_t row, size_t col))[SIZE]
где РАЗМЕР должен быть параметром? Или я должен объявить эту функцию по-другому?
2) это правильный путь для того, что я здесь пробовал, или есть другая альтернатива?
Я только пытаюсь вернуть указатель на массив, размер которого известен во время выполнения, а не во время компиляции. Зовmalloc
а такжеfree
происходит только один раз, и это хороший подход, потому что всякий раз, когдаmalloc
наша программа мешает ядру выделить память и пометить страницу как доступную для записи. Так что у этого метода меньше накладных расходовkernel
, Это может быть написано в одномmalloc
работа с VLA
РЕДАКТИРОВАТЬ:
@ChronoKitsune сказал, что я должен использовать / попробовать[]
(массив неопределенного размера), в этом случае функция станет такой:
int (*foo(size_t row, size_t col))[]{ /* code */ }
Это то, что я должен использовать?