Вот код (C99), который работает - вывод получается аккуратным, если ваше окно имеет ширину более 100 столбцов (установите 32 на меньшее число, если у вас узкие окна):
#include <stdio.h>
enum { NumberOfKeys = 20, LengthOfKeys = 32 };
static void keySorter(char (*keys)[NumberOfKeys][LengthOfKeys])
{
size_t k = 0;
for (size_t i = 0; i < NumberOfKeys; i++)
for (size_t j = 0; j < LengthOfKeys; j++)
(*keys)[i][j] = ++k & 0xFF;
}
static void dumpKeys(char keys[NumberOfKeys][LengthOfKeys])
{
for (size_t i = 0; i < NumberOfKeys; i++)
{
for (size_t j = 0; j < LengthOfKeys; j++)
printf("%02X ", keys[i][j] & 0xFF);
putchar('\n');
}
}
int main(void)
{
char keys[NumberOfKeys][LengthOfKeys] = {};
printf("Before:\n");
dumpKeys(keys);
keySorter(&keys);
printf("After:\n");
dumpKeys(keys);
}
Обратите внимание на принципиальную разницу между нотациями, используемыми для доступа к массиву в keySorter()
по сравнению с dumpKeys()
. Во-первых, поскольку передается указатель на 2D-массив, код для доступа к массиву должен сначала разыменовать указатель с помощью (*keys)[i][j]
, тогда как во втором случае массив передается напрямую, и нотация прямого доступа keys[i][j]
в порядке .
Когда я скомпилировал (GCC 4.2.1 на MacOS X 10.6.5), используя:
gcc -O -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition xx.c -o xx
указанный код компилируется без ошибок. Когда я экспериментировал с использованием keys[i][j]
в keySorter()
, он жаловался на «ошибку: несовместимые типы в присваивании».
Вы также можете изменить keySorter()
, чтобы использовать strcpy()
(вам, конечно, тоже нужно #include <string.h>
):
static void keySorter(char (*keys)[NumberOfKeys][LengthOfKeys])
{
for (size_t i = 0; i < NumberOfKeys; i++)
strcpy((*keys)[i], "BLAH");
}
Вы все еще должны разыменовать указатель на массив перед индексацией в массив.
Если / когда вы написали:
strcpy(keys[i], "BLAH");
тогда вы должны получать предупреждения компилятора (если вы не получаете лучший компилятор или, по крайней мере, решите, как заставить ваш компилятор выдавать обильные предупреждения), но значение keys[0]
было первым массивом в наборе массивов, указанном keys
, затем keys[1]
был вторым массивом, keys[2]
был третьим массивом и так далее. Указатель может затухать настолько, что вы в конечном итоге будете писать BLAH над первой строкой каждого массива, но в итоге вы получите дамп ядра или другие подобные проблемы, потому что вы не выделяете достаточное количество массивов в основной программе.