Se eu tiver um ponteiro nulo, como faço para colocar um int para ele?
-
19-09-2019 - |
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?
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.