k&r 的 c程序设计语言第二版 6.3节内容里的代码的矛盾问题, 请遇到过的大神讲解一下解决方案。

1.这一章讲解了结构数组的用出问题:
struct key {
char *word;
int count;
} keytab[NKEYS];

2.随后讲解了NKEYS的机器自动计算问题
#define NKEYS (sizeof(keytab) / sizeof(keytab[0]))

但是这两天放在一个c文件中编译时不管谁放在前面(NKEYS和keytab)这两个变量之间总有一个是未定义的让我很恼火,这是鸡生蛋的悖论啊?这一章的代码能编译成功吗?

给自己回一下,我突然想到了问题所在看到的大神看我判断的对不对,书中定义了
struct key {
char word;
int count;
} keytab[] = {
"auto", 0,
"break", 0,
"case", 0,
"char", 0,
"const", 0,
"continue", 0,
"default", 0,
/
... */
"unsigned", 0,
"void", 0,
"volatile", 0,
"while", 0
};
也就是说书中先初始化一个结构,然后拿#define NKEYS (sizeof(keytab) / sizeof(keytab[0])) 来计算NKEYS就是这样的吧?
突然结合本例子的目的是为了统计关键词出现的次数大概搞清楚了。

不过总感觉这样写是脱裤子放屁啊。。。。

LZ你确定下面这个代码能够正确的编译通过吗?首先,你的字符类型使用不正确;为什么char *world突然变成了char word;你用char word只能对其赋值一个
字符,是不能够初始一个“字符串”的,解决方法有2个:
(1)char *world;采用calloc/realloc/malloc来为其进行动态的内存分配,只有为该指针变量分配了内存空间之后,才能对其初始化赋值;
(2)将char *word改为一个指针数组,这样也可以实现;
但是你对字符变量word初始化一个字符串是编译不通过的;

 struct key {
char word;
int count;
} keytab[] = {
"auto", 0,
"break", 0,
"case", 0,
"char", 0,
"const", 0,
"continue", 0,
"default", 0,
/ ... */
"unsigned", 0,
"void", 0,
"volatile", 0,
"while", 0
};