| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
dgs3333
Registrado: 23 Nov 2012 Mensajes: 7 Ubicación: Benidorm
| Publicado: 06/04/2014 4:33 am | | | Título: Ayuda para comprender error en programa. |
| Hola,
Estoy aprendiendo a programar en C y me he quedado un poco atascado con un ejercicio. No entiendo porque el programa que pongo a continuación produce un error durante su ejecución.
#include <stdio.h> #include <stdlib.h> void asigmem(int *p, int t);
main() { int *p = NULL; asigmem(p, 3); p[0] = 10, p[1] = 20, p[2] = 30; printf("%d\n"), p[1]; }
void asigmem(int *p, int t) { p = (int *)malloc(t * sizeof(int)); }
¿Alguien que lo entienda me lo podría explicar? Un saludo. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7517 Ubicación: Mexico
| Publicado: 06/04/2014 5:35 am | | | Título: |
| El error se genera porque en C todo se pasa por valor, si quieres emular el paso por referencia debes pasar la dirección de la variable (mediante el operador "&") y aplicar indireccion (mediante el operador "*") en la función.
En tu caso ya que la variable a modificar ("p" de main) es de tipo "int *" el parámetro de la función "asigmem" debe ser "int **p".
Ademas hay que cambiar la llamada a printf porque el paréntesis de cierre esta mal colocado. Con ese y otros cambios menores:
| Código: | #include <stdio.h> #include <stdlib.h>
void asigmem(int **p, int t);
int main(void) { int *p; asigmem(&p, 3); p[0] = 10, p[1] = 20, p[2] = 30; printf("%d\n", p[1]); return 0; }
void asigmem(int **p, int t) { *p = malloc(t * sizeof(int)); } |
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | dgs3333
Registrado: 23 Nov 2012 Mensajes: 7 Ubicación: Benidorm
| Publicado: 06/04/2014 9:51 am | | | Título: |
| Muchas gracias por tu ayuda. Ahora ya lo veo más claro, pero menudos líos me estoy montando con el tema de punteros. Cada vez que me parece que lo he entendido, aparece algún detalle que me vuelve a liar. A ver si se me va quedando poco a poco de ir practicando con ellos.
Un saludo. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |