Pergunta

Eu tenho uma matriz de valores arbitrários, então eu o defini como uma matriz de ponteiros void, para que eu possa apontar para qualquer tipo de informação (como int, arrays de caracteres, etc). No entanto, como eu realmente atribuir um int para ele?

Tome por exemplo, essas inicializações:

void* data[10];
int x = 100;

Minha intuição pensaria isso, mas isso dá um erro de compilação:

data[0] = malloc(sizeof(int));
*(data[0]) = x;

Além disso Pensei em usar &x, mas gostaria de aproveitar o endereço de uma variável local, que (no meu entender) seriam apuradas após sair do procedimento. Então, se eu tenho um x variável local, como eu colocá-lo em um tipo de ponteiro vazio de variável corretamente?

Foi útil?

Solução

*((int*)data[0])=x;

irá fazê-lo.

Você pode querer considerar o uso de uma união. Algo parecido com isto:

union myvalues
{
    int i;
    double d;
    long l;
};

Você poderia então ter

union myvalues *foo[10];
foo[0] = malloc(sizeof(union myvalues));
foo[0]->i = x;

Você também pode typedef a união. sizeof(union myvalues) será o máximo de sizeof os membros. Então se você tem int i; e char c[40] na união, sizeof(union myvalues) será 40. Escrita para i irá então substituir os 4 primeiros caracteres em c (assumindo seus ints são 4 bytes).

Outras dicas

*((int *)data[0]) = x;

Uma cópia x será feita, de modo que o fato de que é uma variável local não é importante.

para aliasing razões sua muito melhor fazer

mempcy( data[0], &x, sizeof( int ) );

Como acontece o compilador irá otimizar o memcpy chamar como sizeof (int) é um valor constante, mas ele não vai quebrar várias regras aliasing.

Embora você possa usar um elenco para fazer a atribuição, é provavelmente muito mais limpo para escrever o código como:

void *data[ 10 ];
int x = 100;
int *p;

p = malloc( sizeof *p );
data[ 0 ] = p;
*p = x;

tente o seguinte:

data[0] = malloc(sizeof(int));
*((int*)data[0]) = x;

ou

(int) (*(data[0])) = x;

não se esqueça de

free (data[0]);

depois.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top