Inicialicé el puntero con una constante, y sabía que su dirección se entregará al puntero. Entonces, cuando intenté probar si la constante se puede imprimir o no, el programa se bloqueó. ¿Eso es ilegal?

#include <stdio.h>

int main()
{
   int *i = (int *)1;

    printf("The value that i pointer points to is %d\n", *i);

    return 0;
}
c
1
s ange 9 may. 2019 a las 15:16

3 respuestas

La mejor respuesta

Parece que piensa que (int *)1 produce la dirección donde se almacena el valor 1. No es asi.

Cuando se usa una conversión como (int *) para convertir un entero en un puntero, el resultado generalmente es que el valor se convierte en una dirección. 1

Por lo tanto, int *i = (int *)1; establece i para que apunte a la dirección 1. Luego, al intentar imprimir *i, su programa se bloqueó porque 1 no era una dirección de memoria válida. (Muy comúnmente, la primera página de memoria se mantiene sin asignar para que los usos incorrectos del puntero nulo se bloqueen y revelen un problema en lugar de permitir que el programa continúe ejecutándose con datos incorrectos).

Para configurar i para que apunte a un int con el valor 1, debe establecerlo en la dirección de un objeto int que tenga el valor 1. Una forma de hacerlo es:

int n = 1;
int *i = &n;

También puede crear un int sin nombre con el valor 1 usando un literal compuesto:

int *i = & (int) { 1 };

El (int) { 1 } crea un literal compuesto con el valor 1, y el & toma su dirección, y luego i se inicializa en esa dirección.

Nota

1

5
Eric Postpischil 9 may. 2019 a las 12:45

(int *) 1; no es un puntero al valor 1. sino el puntero a la celda de memoria # 1. Lo que probablemente desee es

#include <stdio.h>

int main()
{
   int n=1;
   int *i = &n;

    printf("The value that i pointer points to is %d\n", *i);

    return 0;
}
5
Dr Phil 9 may. 2019 a las 12:22
printf("The value that i pointer points to is %d\n", *i);

Intenta desreferenciar el puntero i, pero su valor (el valor del puntero) es algún valor, usted mismo lo configura. ¿Puedes garantizar que en la dirección 0x0001 hay un número entero que posees? Todo lo que puede hacer con dicho puntero es imprimir su valor de puntero (no el valor al que apunta):

printf("The value of pointer i is %p\n", i);
3
Swordfish 9 may. 2019 a las 12:23