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;
}
3 respuestas
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
(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;
}
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);
Preguntas relacionadas
Nuevas preguntas
c
C es un lenguaje de programación de uso general utilizado para la programación del sistema (SO e integrado), bibliotecas, juegos y multiplataforma. Esta etiqueta debe usarse con preguntas generales sobre el lenguaje C, como se define en el estándar ISO 9899 (la última versión, 9899: 2018, a menos que se especifique lo contrario; también etiquete las solicitudes específicas de la versión con c89, c99, c11, etc.). C es distinto de C ++ y no debe combinarse con la etiqueta C ++ en ausencia de una razón racional.