1

よし、これで行く。here で説明されているように、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.

私が考えることができる2つの考えられる原因は、私のループが正しくないか、私には意味がないか、初期化が何らかの形で間違っていることです。ただし、このサイトや一般的に Google で検索しても役に立ちませんでした。私は他のソリューションにもオープンですが、なぜこれがうまくいかないのかにも興味があります.

ありがとう!

4

4 に答える 4

5

この表現は間違っています:

lookuptable + i * sizeof(symstruct_t)

で十分です

lookuptable + i

コンパイラは、配列内の各メンバーのサイズを既に認識しているため、配列に追加iすることは index を使用することを意味することを認識していますi。つまり、 と同じこと&lookuptable[i]です。

于 2013-05-20T09:37:39.710 に答える
2

sizeof(symstruct_t)係数を下げる必要があります。C および C++ ポインター演算は、これを自動的に行います。

これを理解するために、ポインター演算と配列アクセスは同じものであることを思い出してください。

Array[i]と同じです*(Array + i)

書かなければならないのは不便であり、書かArray[i * sizeof(...)]なければならない場合も同様に不便です*(Array + i * sizeof(...))

于 2013-05-20T09:39:59.290 に答える
2

ポインターが指すオブジェクトのサイズに合わせてポインターをスケーリングする必要はありませんlookuptable + i * sizeof(symstruct_t);。コンパイラが自動的にそれを行います。

ptr+1;の後の次のオブジェクトへのポインタとしてコンパイラによって解釈されます。最初の配列要素を指している*ptr場合、2 番目の配列要素を指します。ptrptr+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 に答える
1
symstruct_t *sym = lookuptable + i * sizeof(symstruct_t);

する必要があります

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