C - 没有正确初始化字符串成员的结构的静态数组?

Jus*_*ent 1 c arrays string struct initialization

好的,所以这里.我尝试过在C字符串值做一个开关,如所描述这里.但是,结构数组似乎没有正确初始化.我的(简化)程序如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BADKEY     -1
#define VALUE       1
#define OTHERVALUE  2
#define FOOVALUE    3

#define NREQKEYS (sizeof(lookuptable)/sizeof(symstruct_t))

typedef struct {
    char *key;
    int val;
} symstruct_t;

static symstruct_t lookuptable[] = {
    { "some value here", VALUE },
    { "other value",     OTHERVALUE },
    { "yet another one", FOOVALUE }
};

int main(void) {
    // Testing...
    int i;
    for (i = 0; i < NREQKEYS; i++) {
        symstruct_t *sym = lookuptable + i * sizeof(symstruct_t);
        printf("%d: key = '%s', val = %d.\n", i, sym->key, sym->val);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我test.c在Debian Jessie(目前正在测试)上编译上面的程序,如下所示(很明显可以保存).gcc的版本是gcc version 4.7.2 (Debian 4.7.2-5).编译不会发出警告或错误.

gcc test.c -o test -std=gnu99
Run Code Online (Sandbox Code Playgroud)

现在,我希望这个简单的程序只打印出我初始化数组的值.但是,输出是这样的:

$ ./test 
0: key = 'some value here', val = 1.
1: key = '(null)', val = 0.
2: key = '(null)', val = 0.
Run Code Online (Sandbox Code Playgroud)

我能想到的两个可能的原因是我的循环不正确,这对我来说没有意义,或者初始化在某种程度上是错误的.但是,搜索此网站以及Google上的一般情况并没有帮助我.我也对其他解决方案持开放态度,但也对这为什么不起作用感兴趣.

谢谢!

Som*_*ude 5

这个表达式错了:

lookuptable + i * sizeof(symstruct_t)
Run Code Online (Sandbox Code Playgroud)

这就够了

lookuptable + i
Run Code Online (Sandbox Code Playgroud)

编译器已经知道数组中每个成员的大小,因此它知道添加i到数组意味着它将使用索引i,即它与之相同&lookuptable[i].