0

私は単純な構造を持っています:

typedef struct {
    void *things;
    int sizeOfThings;
} Demo;

things は、文字列や整数など、個々の「もの」の配列を含むことを意図しています。私はそれへのポインタを作成します:

Demo * Create(int value) {
    Demo *d = malloc(sizeof(Demo));
    if (d != NULL) {
        d->sizeOfThings = value;
        d->things = malloc(20 * value); // We'll have a max of 20 things
    }
}

valueたとえば、int の配列の場合は sizeof(int) です。

別の関数で d->things に何かを挿入したい場合 (少なくとも最初のスロットに追加するだけではなく、位置管理は他の場所で行われると仮定します):

char * thing = "Me!";
strncpy(d->things[0], &thing, d->sizeOfThings);

strncpyエリアを回ります

test.c:10: warning: pointer of type ‘void *’ used in arithmetic
test.c:10: warning: dereferencing ‘void *’ pointer
test.c:10: error: invalid use of void expression

関数を一般化する方法として void* の使用を理解しようとしています。に何か問題があるのではないかと思いd->things[0]ます。

4

4 に答える 4

4

C 標準によると、void にはサイズがありません。sizeof(void) は定義されていません。(一部の実装では sizeof(int) にしていますが、これは準拠していません。)

foo 型の配列がある場合、この式は次のようになります。

array[3]

配列に格納されているアドレスに 3*sizeof(foo) を加算してから参照します。これは、値がすべてメモリにまとめられているためです。sizeof(void) は定義されていないため、void 配列に対してこれを行うことはできません (実際には、void 配列を使用することさえできず void ポインターのみを使用できます)。

配列として扱う前に、任意の void ポインターを別のポインター型にキャストする必要があります。

d->things = malloc(20 * sizeof(int));
(int *)(d->things)[0] = 12;

ただし、 strncpy を使用するためにそれを行う必要さえないことに注意してください。strncpy は void ポインターを問題なく受け入れることができます。しかし、あなたは strncpy を間違って使用していました。strncpy の呼び出しは次のようになります。

strncpy(d->things, thing, d->sizeOfThings);

あなたのバージョンでは、d->things の最初の配列メンバーをポインタとして扱わないようにし、char ** である &thing を単なる char * であるかのように扱っていたでしょう。

于 2011-04-22T01:40:09.850 に答える
1

これで問題が解決するかどうかを確認してください。

char *thing = "Me!";
strncpy(&d->things[0], thing, d->sizeOfThings);

次に、ポインターをキャストして警告を取り除きますが、何をしようとしているのかを確認する必要があります

char *thing = "Me!";
strncpy((char *) &d->things[0], (const char *) thing, d->sizeOfThings);
于 2011-04-22T01:35:09.960 に答える
0
Demo *d = malloc(sizeof(Demo));
if (d != NULL) {
    d->things = malloc(20 * sizeOfThings); // We'll have a max of 20 things
}

何にsizeOfThings初期化されますか? おそらくゴミが含まれている可能性があり、エラーの原因となっています。デフォルトで0に初期化されていても、mallocNULL( malloc( 20 * 0 ) ;) を返します。それで、私は思う -

strncpy(d->things[0], &thing, d->sizeOfThings);
      // ^^^^^^^^^^ causing the error.
于 2011-04-22T01:32:12.287 に答える