0

からキャストバックするにはvoid*

int *a[13][12];
void *b
int *c[13][12];

b = (void*) a;
c = (?????) b;

これ

c = (int *[13][12])b;

言うcast specifies array type

これ

c = (int *[][])b;

と言いarray type has incomplete element typeます。

コンパイラはgcc (Ubuntu/Linaro 4.6.1)

4

3 に答える 3

1

c と a はポインターではなく配列です。上記を参照してください。次のような(2次元)配列へのポインターを使用できます

int a[13][12] ={ 1,2,3 };
void *b = &a;
int (*c)[13][12] = b;

キャストなしのすべて

于 2012-12-02T20:57:17.710 に答える
0

配列に直接割り当てたり、C で配列型にキャストしたりすることはできません。ただし、配列はポインターに減衰するため、データをvoid *ポインター (つまり: memcpy) から配列にコピーして、配列として使用することができます。

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

int main() {
    int a1=1, a2=2, a3=3, a4=4;

    int *a[2][2] = { { &a1, &a2 }, { &a3, &a4 } };
    printf("%d %d %d %d\n", *a[0][0], *a[0][1], *a[1][0], *a[1][1]);

    void *b;
    b = (void*) a;

    int *c[2][2];
    memcpy(c, b, sizeof(c));
    printf("%d %d %d %d\n", *c[0][0], *c[0][1], *c[1][0], *c[1][1]);

    return 0;
}

次のプログラムをコンパイルして実行すると、次のようになります。

1 2 3 4
1 2 3 4

ただし、caは現在 2 つの異なる配列です。

于 2012-12-02T19:47:37.500 に答える