好的,所以这里。我正在尝试在C中切换字符串值,如here所述。但是,结构数组似乎没有正确初始化。我的(简化)程序如下所示:
#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);
}
}
然后,我在Debian Jessie(目前正在测试)上编译上面的程序如下(它显然保存在test.c
中)。 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.
我能想到的两个可能的原因是我的循环不正确,这对我来说没有意义,或者初始化在某种程度上是错误的。但是,搜索此网站以及Google上的一般情况并没有帮助我。我也对其他解决方案持开放态度,但也对为什么不感兴趣。
谢谢!
答案 0 :(得分:5)
这个表达式错了:
lookuptable + i * sizeof(symstruct_t)
就足够了
lookuptable + i
编译器已经知道数组中每个成员的大小,因此它知道向数组添加i
意味着它将使用索引i
,即它与{{1}相同}}
答案 1 :(得分: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);
}
答案 2 :(得分:2)
您应该删除sizeof(symstruct_t)
系数。 C和C ++指针算法会自动为您执行此操作。
为了帮助理解这一点,请记住指针算术和数组访问是一回事:
Array[i]
与*(Array + i)
如果你必须写Array[i * sizeof(...)]
,那么写*(Array + i * sizeof(...))
会很不方便,因此同样不方便。
答案 3 :(得分:1)
symstruct_t *sym = lookuptable + i * sizeof(symstruct_t);
应该是
symstruct_t *sym = lookuptable + i;