Мне удалось работать с массивами переменной длины в 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
, но точного объяснения этой ситуации нет и гугл тоже не помогает, поэтому у меня два вопроса:
1) Возможно ли это int (*foo(size_t row, size_t col))[SIZE]
, где SIZE должен быть параметром? Или я должен объявить эту функцию по-другому?
2) это правильный путь для того, что я пробовал здесь, или есть другая альтернатива?
Я только пытаюсь вернуть указатель на массив, размер которого известен во время выполнения, а не во время компиляции. Вызов malloc
и free
происходит только один раз, и это хороший подход, потому что всякий раз, когда вызывается malloc
, наша программа мешает ядру выделить память и пометить страницу как доступную для записи. Таким образом, этот метод имеет меньше накладных расходов на kernel
. Его можно написать одним malloc
работающим с VLA
ИЗМЕНИТЬ:
@ChronoKitsune сказал, что я должен использовать/попробовать []
(массив неопределенного размера), и в этом случае функция станет такой:
int (*foo(size_t row, size_t col))[]{ /* code */ }
Это то, что я должен использовать?
[]
(массив неопределенного размера) ==>int (*func(size_t row, size_t col))[];
? 27.05.2016[]
форму, предложенную ChronoKitsune, но я думаю, что вам будет труднее работать с ней практически во всех отношениях. 27.05.2016