2012-04-12 2 views
0

Я изменяю существующий код для нового проекта. Мне было поручено удалить динамическое выделение памяти и использовать статическое объявление.Как получить доступ к двумерному массиву неизвестного размера с помощью указателя на массив

Существует переменная arrp, ранее она представляла собой двойной указатель, на который будет выделяться память с помощью malloc, и к ней будет обращаться как 2D-массив.

Теперь я изменил его как указатель на массив i.e: char (* arrp) [];

Размер 2D-массива, на который указывают точки прихода, будет известен только во время выполнения. Моя проблема в том, если размер не объявлен компилятор бросает ошибку ('символ (*) []: неизвестен размер)

Пожалуйста, обратитесь следующий код, я сделал что-то вроде этого

char (*arrp)[]; //This will be from different module, 
     //I have declared as local variable for our reference 

char (*parr)[2]; 

char arr[3][2]; 

parr = &(arr[0]); 
arrp = (char (*)[])&(arr[0]); 

//inside loops for i, j 
... 

printf("%c",parr[i][j]); // This works fine 
printf("%c",arrp[i][j]); // Error :'char (*)[]' : unknown size) 

.... 
//Some code 

Это не возможно получить размер массива при объявлении arrp. Есть ли способ устранить эту ошибку?

+0

Извините, что забыл упомянуть, этот проект находится в C – Cks

+0

Какая версия C? – Christoffer

+0

Приложение построено для работы с различными компиляторами, такими как GCC 2.9.5, 3.4 (не уверен в этом), компилятор VC++ и т. Д. – Cks

ответ

0

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

Но если у вас есть современный компилятор, который поддерживает массивы переменной длины (C99), то его довольно простой

int foo (int m, int n) 
{ 
    int a[m][n]; 
    int (*ptr)[n]=a; 
    a[0][2] = 78; 
    printf("%d", ptr[0][2]); 

} 
+0

, когда я напрямую назначаю адрес двумерного указателя 2D-массива, он вылетает во время выполнения. char ***** pparr; char arr [3] [2]; pparr = (char *****) arr; когда я пытаюсь напечатать как printf («% c», pparr [i] [j]); он падает. (извините за плохой отступ, я знаю, как делать отступы) :( – Cks

+0

Можете ли вы показать, как вы обращаетесь к 2D-массиву, используя ваш двойной указатель? –

+0

@Cks Я отредактировал свой ответ. Двойные указатели не могут работать, опять же, для того же Причина, по которой они не знают ширину массива (размер столбца). Поэтому я боюсь, что вы не можете продолжить, не зная размер столбца. –

0

Вот статья от Доктора Доббс, что объясняет это лучше, чем я могу надеяться, а также включает в себя советы по работе с массивами переменной длины в C90 и C99: http://www.drdobbs.com/184401444

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