1

好了,就到这里吧。我正在尝试在 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);
    }
}

test.c然后,我在Debian Jessie(目前正在测试)上编译上述程序如下(显然是保存在其中)。gcc 的版本是gcc version 4.7.2 (Debian 4.7.2-5). 编译不会给出警告或错误。

gcc test.c -o test -std=gnu99

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

$ ./test 
0: key = 'some value here', val = 1.
1: key = '(null)', val = 0.
2: key = '(null)', val = 0.

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

谢谢!

4

4 回答 4

5

这个表达是错误的:

lookuptable + i * sizeof(symstruct_t)

就够了

lookuptable + i

编译器已经知道数组中每个成员的大小,所以它知道添加i到数组意味着它将使用 index i,即它与&lookuptable[i].

于 2013-05-20T09:37:39.710 回答
2

您不必将指针缩放到它指向的对象的大小lookuptable + i * sizeof(symstruct_t);;编译器会自动为您执行此操作。

ptr+1编译器会将其解释为指向;之后的下一个对象的指针 *ptr如果ptr指向第一个数组元素,ptr+1将指向第二个。

for (i = 0; i < NREQKEYS; i++) {
        symstruct_t *sym
        sym = lookuptable + i;
        printf("%d: key = '%s', val = %d.\n", i, sym->key, sym->val);
    }

或者,它的等价物:

for (i = 0; i < NREQKEYS; i++) {
        symstruct_t *sym
        sym = & lookuptable[i];
        printf("%d: key = '%s', val = %d.\n", i, sym->key, sym->val);
    }

顺便说一句:这里不需要指针,数组索引可以正常工作:

for (i = 0; i < NREQKEYS; i++) {
        printf("%d: key = '%s', val = %d.\n", i, lookuptable[i].key, lookuptable[i].val);
    }
于 2013-05-20T09:37:55.680 回答
2

你应该放弃sizeof(symstruct_t)系数。C 和 C++ 指针算法会自动为您执行此操作。

为了帮助理解这一点,请记住指针算术和数组访问是一回事:

Array[i]是相同的*(Array + i)

不得不写会很不Array[i * sizeof(...)]方便,因此如果你不得不写也同样不方便*(Array + i * sizeof(...))

于 2013-05-20T09:39:59.290 回答
1
symstruct_t *sym = lookuptable + i * sizeof(symstruct_t);

应该

symstruct_t *sym = lookuptable + i;
于 2013-05-20T09:39:41.317 回答