11

Я пытаюсь понять, что такое «лучшая практика» (или действительно какая-либо практика) для передачи многомерного массива в функцию из c. Разумеется, это зависит от приложения, поэтому рассмотрим возможность записи функции для печати двумерного массива переменной величины. В частности, меня интересует, как написать функцию printArry(__, int a, int b) в следующем коде. Я опустил первый параметр, поскольку я не совсем уверен, что это должно быть.Передача многомерного массива с переменным размером

void printArry(_____, int a, int b){ 
/* what goes here? */ 
} 


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

int a1=5; 
int b1=6; 
int a2=7; 
int a2=8; 

int arry1[a1][b1]; 
int arry2[a2][b2]; 

/* set values in arrays */ 

printArry(arry1, a1, b1); 
printArry(arry2, a2, b2); 

} 
+0

Я разместил последующую деятельность по адресу: http://stackoverflow.com/questions/34560001/passing -a-multidimensional-array-of-variable-size-without-vla – ABD

ответ

14

Самый простой способ (для C99 и последнего)

void printArry(int a, int b, int arr[a][b]){ 
    /* what goes here? */ 
} 

Но, есть и другие способы вокруг

void printArry(int a, int b, int arr[][b]){ 
    /* what goes here? */ 
} 

или

void printArry(int a, int b, int (*arr)[b]){ 
    /* what goes here? */ 
} 

и немного confusing который w плохо работают только функции ProType

void printArry(int a, int b, int arr[*][*]); 
+1

Я никогда не знал, что 'int arr [a] [b]' был опцией в качестве параметра; когда это появилось в стандарте? – abligh

+0

@abligh; С C99. – haccks

+2

вы живете и учитесь. Благодарю. – abligh

1

Это не совсем ответ, но расширенный комментарий к комментарию вопрос в ФП, в «хорошо вы можете передать массив, не зная, количество строк с этим, но то, как будет вам знаете, когда прекратить печать строк? "

Ответ: Как правило, вы не можете, не передавая размер массива тоже. Посмотрите на этот 1-D пример, который разбивает размер массива.

#include <stdio.h> 

int procarr(int array[16], int index) 
{ 
    return array[index]; 
} 

int main (void) 
{ 
    int arr[16] = {0}; 
    printf("%d\n", procarr(arr, 100)); 
    return 0; 
} 

Вывод программы (хотя все элементы инициализируются 0):

768 

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

#include <stdio.h> 

int procarr(int array[16], size_t index, size_t size) 
{ 
    if (index < size) 
     return array[index]; 
    return -1;     // or other action/flag 
} 

int main (void) 
{ 
    int arr[16] = {0}; 
    printf("%d\n", procarr(arr, 100, sizeof arr/sizeof arr[0])); 
    return 0; 
} 

выхода программы:

-1 
Смежные вопросы