/ / C, Динамично разпределение на матрицата: Защо това не е разрешено? - c, указатели, многоизмерно масив, показалец към показалец, гниене

C, динамично разпределение на матрицата: Защо това не е разрешено? - c, указатели, многоизмерно масив, показалец към показалец, гниене

Така че имам следния пример в някои лекции

void f(int **p){}
void g(int *p[]){}
void h(int p[2][3]){}

int main(){
int **a;
allocate_mem(a); // allocate memory for a
f(a); // OK!
g(a); // OK!
// h(a); // NOT OK
int b[2][3];
// f(b); // NOT OK
// g(b); // NOT OK
h(b); // OK!
return 0;
}

(без допълнителни обяснения / коментари). Аз се борят да разбера точно защо f (b) и g (b) биха били незаконни. И двете функции са предназначени да приемат двуизмерни масиви и ние ги наричаме с едно. Как това не работи? Предполагам, че разликата се състои в разпределението на паметта, но как това би повлияло на това как дадена функция го приема като вход?

Отговори:

2 за отговор № 1

Вие конфигурирате указатели с масиви и указатели към указатели с двумерни масиви.

Това е разбираема грешка, поради C (иC ++) "понякога може да се отнесете към масив и да получите указание към първия си елемент, понякога е действителният масив - зависи от контекста. И с двуизмерни масиви става още по-странно, тъй като могат да се използват двуизмерни масиви по-малко места вместо показалец към показалец - към елемент (но все още може да се използва в някои места като това).

Моля, отделете няколко минути да прочетете как се отнасят и се различават указателите и масивите, в Раздел 6 на езика C FAQ. Вашият конкретен въпрос се появява и там:

В 6.18: "Моят компилатор се оплаква, когато преминах двуизмерен масив към функция, която очаква показалец към указател."