这是有效的 (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() 中用于访问数组的符号之间的关键区别。第一种,因为传递了一个指向二维数组的指针,所以访问数组的代码必须首先用(*keys)[i][j]解引用指针,而第二种,直接传递数组,直接访问符号keys[i][j]就可以了.
当我使用(MacOS X 10.6.5 上的 GCC 4.2.1)编译时:
gcc -O -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition xx.c -o xx
显示的代码编译干净。当我尝试在keySorter() 中使用keys[i][j] 时,它抱怨“错误:分配中的类型不兼容”。
您也可以修改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,但您最终会遇到核心转储或其他此类问题,因为您没有在主程序中分配足够的数组。