Puntero vacío de desreferencia

3 minutos de lectura

avatar de usuario
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]);

  • 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

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


avatar de usuario
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]…)

avatar de usuario
Bamsé

No se puede desreferenciar un vacío puntero porque no tiene un tipo, primero debes lanzarlo(int *)lVptrluego desreferenciarlo *(int *)lVptr.

int lVNum = 2;
void *lVptr;
lVptr = &lVNum;

printf("\nlVptr[60 ] is  %d \n",*(int *)lVptr);

avatar de usuario
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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad