Ответ от ObscureRobot в порядке, и ниже есть и другое решение.
Используйте typedef
и позвольте компилятору управлять смещением массива. Смотрите код ниже.
#include <assert.h>
void test(char **table, int y) /* the x dimension is not needed here */
{
typedef char array_t[y];
typedef array_t *array_ptr;
array_t *tmp_array = (array_ptr)table;
/* and access the table */
tmp_array[1][2] = 1;
return;
}
int main()
{
char table[2][3];
table[1][2] = 0;
assert(table[1][2] == 0);
test((char**)table, 3);
assert(table[1][2] == 1);
return 0;
}
Отредактировано: извините, но я сначала загрузил неверную версию, которая сейчас исправлена. Если вы не можете его скомпилировать, используйте текущий код или проверьте, есть ли такой дополнительный астероид, как он, в array_t *tmp_array = (*array_ptr)table;
, строка 7. Если это так, просто удалите последний.
Кроме того, код отлично работает на моем ноутбуке с gcc (GCC) 4.6.1 20110819 (prerelease)
с параметрами компиляции gcc a.c
или gcc a.c -ansi