Incluso después de lanzar un puntero vacío, obtengo un error de compilación al eliminar la referencia. ¿Alguien podría por favor decirme la razón de esto?
int lVNum = 2;
void *lVptr;
lVptr = (int*)&lVNum;
printf("\nlVptr[60 ] is %d \n",lVptr[1]);
Saurabh Ghorpad
Incluso después de lanzar un puntero vacío, obtengo un error de compilación al eliminar la referencia. ¿Alguien podría por favor decirme la razón de esto?
int lVNum = 2;
void *lVptr;
lVptr = (int*)&lVNum;
printf("\nlVptr[60 ] is %d \n",lVptr[1]);
Ejemplo de lo que podría estar tratando de hacer:
#include <stdio.h>
int main () {
void *v;
unsigned long int *i = (unsigned long int *)v;
*i = 5933016743776703571;
size_t j = sizeof(i);
printf("There are %ld bytes in v\n", j);
size_t k;
for (k = 0; k < j; k++) {
printf("Byte %ld of v: %c\n", k, ((char *)v)[k]);
}
}
Producción:
There are 8 bytes in v
Byte 0 of v: S
Byte 1 of v: T
Byte 2 of v: A
Byte 3 of v: C
Byte 4 of v: K
Byte 5 of v: O
Byte 6 of v: V
Byte 7 of v: R
+1 lo único que queda en esto es el elenco, que en C no es necesario. Aparte de eso, esto lo aborda todo.
– WhozCraig
18 de marzo de 2013 a las 1:35
@WhozCraig: Sí, solo quería que fuera lo más claro posible. Aunque supongo que debería mencionarlo; puede prevenir tonto malloc
lanza en el futuro.
– Ed S.
18 de marzo de 2013 a las 1:36
tépico
printf("\nlVptr[60 ] is %d \n", *(int*)lVptr);
Esto lanzará el puntero vacío a un puntero a un int
y luego desreferenciarlo correctamente.
Si desea tratarlo como una matriz (de uno), podría hacer un poco feo ((int *)lVptr)[0]
. Utilizando [1]
está fuera de los límites, y por lo tanto no es una buena idea (en cuanto a lVptr[60]
…)
Bamsé
No se puede desreferenciar un vacío puntero porque no tiene un tipo, primero debes lanzarlo(int *)lVptr
luego desreferenciarlo *(int *)lVptr
.
int lVNum = 2;
void *lVptr;
lVptr = &lVNum;
printf("\nlVptr[60 ] is %d \n",*(int *)lVptr);
trucos
@ Code-Guru Traté de compilarlo en Visual Studio. Da error: la expresión debe ser un puntero para completar el objeto.
Gracias teppic, como sugirió, lo siguiente compila y produce el resultado correcto.
#include<stdio.h>
void main(){
printf("study void pointers \n");
int lvnum = 2;
void *lvptr;
lvptr = &lvnum;
printf("\n lvptr is %d\n",((int *)lvptr)[0]);
}
Sin embargo, si pruebo printf(“\n lvptr es %d\n”,((int *)lVptr)[60]); Se compila y ejecuta, pero da un número aleatorio.
Muchas gracias amigos por todas las sugerencias. Disculpas por haber asignado un puntero vacío a un puntero int emitido innecesariamente y esperaba que se quitara la referencia. Sin embargo, debería haberlo lanzado cuando quiero quitarle la referencia.
Propósito del fragmento: en mis fuentes encontré un error de klocwork causado por una situación similar. Por el contrario, el programa no solo compiló sino que también dio resultados correctos. Razón: es un código de bajo nivel (sin sistema operativo) donde la memoria asignada al puntero vacío ya está reservada hasta la cuenta de 60. Pero la herramienta klocwork no pudo analizar los archivos que tenían ese límite, lo que resultó en un error. Hice muchas lluvias de ideas y terminé en algo tonto.
Saurabh
No puede desreferenciar un puntero vacío. ¿Cuál es el error de compilación real?
– Mateo D
18 de marzo de 2013 a las 1:29
En cuatro líneas de código tenemos (a) una conversión innecesaria, (b) una desreferencia ilegal de un puntero sin tipo y (c) un comportamiento indefinido fuera de los límites.
– WhozCraig
18 de marzo de 2013 a las 1:30
¿Qué errores del compilador obtienes? Es difícil decirle el motivo de los errores sin los errores reales.
– Aprendiz de código
18 de marzo de 2013 a las 1:31
@Code-Guru: En general, sí. Aquí, no tanto.
– Ed S.
18 de marzo de 2013 a las 1:32
Qué esperas
lVptr[1]
¿regresar?– beatgammit
18 de marzo de 2013 a las 1:36