Alguien sabe que falla en este programa?? --> Funcion malloc

Iniciado por Mozzard, 6 Diciembre 2018, 15:12 PM

0 Miembros y 1 Visitante están viendo este tema.

Mozzard

Pues en vez de mostrar en pantalla el puntero que ocupa menos memoria, me pone algo estilo --> Eh0 <--
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
printf("Introduzca su nombre: ");
char nombre[20],*p_nombre;
int longitud=strlen(nombre);
gets(nombre);
p_nombre=(char*)malloc((longitud+1)*sizeof(char));
printf("%s",p_nombre);
}
Programalo... sin miedo...

K-YreX

Has creado un puntero a <char>. Como su nombre indica un puntero apunta y el tuyo no apunta a ningún sitio. Lo que haces con <malloc> es reservar espacio en ese puntero pero en este caso ya tienes una cadena C que es <nombre> entonces con hacer que <p_nombre> apunte a <nombre> ya está.

int main(){
printf("Introduzca su nombre: ");
char nombre[20],*p_nombre;
fgets(nombre, 20, stdin);
p_nombre = nombre;
printf("%s",p_nombre);
}


Además de eso te he modificado la función <gets()> ya que es mejor usar <fgets()> y así especificar el número de caracteres que va a coger la función. De todos modos si lo dejas así e introduces 19 o 20 caracteres se te va a quedar el último o los dos últimos en el buffer ya que tienes capacidad para 20 caracteres pero tienes que contar el salto de línea "\n" cuando pulsas enter y el "\0" que indica el final de cadena.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Mozzard

Gracias por solicionarlo, pero la cosa es que estoy practicando la funciona malloc, por eso insisto en ponerlo en el programa. De esa forma reducir el espacio de la memoria que ocupa p_nombre
Programalo... sin miedo...

K-YreX

Para copiar por ejemplo los caracteres útiles de <nombre> en <p_nombre> puedes usar la función <strncpy()> que te permite introducir cuántos caracteres se van a copiar. Ya que el problema que tú estabas teniendo es que en ningún momento asignas un valor a <p_nombre>. No es lo mismo reservar espacio que asignar, primero haces hueco para meter algo, pero luego tienes que meter ese algo. Y recuerda al trabajar con memoria dinámica liberarla al terminar el programa. Suerte.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Mozzard

Solucionado!
Solo faltaba el strcpy, por eso no me imprimia el nombre que yo queria, un error tonto, pero como este codigo lo habia basado en otro que he visto no lo habre tenido en cuenta, y por eso me costaba tanto.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
printf("Introduzca su nombre: ");
char nombre[20],*p_nombre;
int longitud=strlen(nombre);
gets(nombre);
p_nombre=(char*)malloc((longitud+1)*sizeof(char));
strcpy(p_nombre,nombre);
printf("%s",p_nombre);
}
Programalo... sin miedo...