Soy un novato en lenguaje C, estoy tratando de usar punteros como a continuación.

  1. po1 se define como un puntero que apunta a una dirección. La PC le asigna 1 byte de memoria. po2 es lo mismo. Quiero obtener la dirección de la memoria señalada por po2, pero solo obtengo un 0 inesperado, obviamente no la dirección.

    #include <stdio.h>
    int main(int argc, char *argv[]) {
        char *po2, *po1;
        printf("---%d---\n", po2); 
        return 0;
    }
    

    La salida es:

    demo11.c: 5: 23: advertencia: formato especifica el tipo 'int' pero el argumento tiene el tipo> 'char *' [-Wformat] printf ("- **** -% d - **** - \ n", po2); ~~ ^ ~~ % s 1 advertencia generada. - **** - 0 - **** -

  2. Entonces estoy tratando de dar el valor de foo a la memoria que po2 apunta, pero da un error.

    #include <stdio.h>
    int main(int argc, char *argv[]) {
        char *po2, *po1;
        char foo = 'D';
        *po2 = foo;
        printf("%c---------------\n", *po2); 
        return 0;
    }
    

    La salida es:

    Terminada debido a la señal: FALLO DE SEGMENTACIÓN (11)

Obviamente, el error es causado por la declaración *po2 = foo;

Cualquier ayuda sería apreciada, gracias.

0
forAllBright 23 feb. 2017 a las 14:41

2 respuestas

La mejor respuesta
  1. Está utilizando el especificador de formato incorrecto dentro de la cadena en printf(). %d es específicamente para enteros. Para un puntero debe usar %p.

    Mirando la advertencia que recibió, puede determinar esto a partir de este bit: format specifies type 'int' but the argument has type 'char *', que básicamente significa que el especificador de formato (%d) indica una variable de tipo int pero ha proporcionado un {{ X3}} tipo.

  2. Cuando dice *po2 = foo; en realidad está asignando el valor de foo a lo que sea señalado por po2, en lugar de asignar el dirección de foo en po2 .

    En primer lugar, al asignar una dirección a un puntero, no utilice *, por lo que la primera parte se convierte en po2 =. En segundo lugar, desea asignar la dirección de foo en lugar del valor que contiene, por lo tanto, debe usar el operador "address-of", que es & para que toda la línea se convierta en {{X4} }

    La razón por la cual su código actual produce un error de segmentación es porque, como se mencionó, su código actual asigna el valor de foo, a donde po2 esté apuntando . Debido a que el puntero aún no se ha inicializado correctamente, contiene una dirección indeterminada (generalmente NULL) que no es válida. Por lo tanto, cuando la PC intenta encontrar esta dirección no válida, está tratando de encontrar una ubicación de ubicación de memoria que no existe (por ejemplo, ubicación 0 o ubicación 5 mil millones, etc.). No puede hacer esto, por lo que resulta en un fallo de segmentación.

Parece que has entendido mal un poco cómo funcionan los punteros. Cuando usa char *po2;, esto crea una variable que contiene una dirección . Esto es lo mismo que crear cualquier otro tipo de variable, no hay otra memoria asignada que no sea la memoria utilizada para contener la dirección. Debido a que un puntero definido como este no se inicializa, contendrá un valor de dirección indeterminado. En algunas situaciones (pero no en todas) este valor será NULL o 0, es por eso que su printf genera 0 después de que le da una advertencia.

Si desea que el puntero po2 apunte a la variable foo, entonces ponga la dirección de foo en el puntero. po2 mantendrá la dirección de foo y foo seguirá manteniendo 'D'. 'D' no se mueve mágicamente a alguna otra parte de la memoria señalada por po2, se queda donde está. Si usara el puntero para cambiar el valor de lo que está apuntando, entonces el valor en foo sería el valor alterado.

Por ejemplo:

char *po2;   // A pointer variable that will hold an address of a char
char foo = 'D'; // A variable that will hold a char
po2 = foo;   // po2 contains a new copy of 'D', this is not what you wanted
po2 = &foo;  // po2 contains address of foo, this is right
*po2 = 'C';  // foo will now contain 'C'
*po2 = foo;  // same as using foo = foo
po2 = 'C';   // po2 contains 'C', this is not what you wanted
6
Toby 11 sep. 2017 a las 08:50

El problema está aquí:

*po2 = foo;

Debe asignar la dirección al puntero po2, no el valor. En este caso, asignó el valor del puntero po2 de la variable foo. Si desea asignar una dirección, haga esto:

po2 = &foo;
-1
Mika Alas 23 feb. 2017 a las 14:18