Autor Tema: Ejemplo función malloc en C (lenguajec) para asignar memoria qué es utilización  (Leído 70578 veces)

Mayen Olivares

  • Sin experiencia
  • *
  • Mensajes: 48
    • Ver Perfil
Hola ¿alguien podría explicar y poner un ejemplo sencillo de uso de la función malloc en C?
« Última modificación: 16 de Octubre 2020, 17:56 por Alex Rodríguez »

Alastor8890

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Ejemplo función malloc en C
« Respuesta #1 en: 17 de Julio 2012, 08:42 »
int n;
char* s;
scanf("%d",&n);
s=(char*)malloc(n*sizeof(char));

Mayen Olivares

  • Sin experiencia
  • *
  • Mensajes: 48
    • Ver Perfil
Re:Ejemplo función malloc en C
« Respuesta #2 en: 18 de Julio 2012, 15:03 »
Hola Alastor, agradezco tu esfuerzo pero me siento un poco perdido:

Trato de interpretar línea por línea:

Primera línea: declaramos una variable de tipo int denominada n
Segunda línea: declaramos un puntero a una variable de tipo char y a ese puntero lo denominamos s
Línea 3: pedimos al usuario que introduzca un número ¿Es esto correcto? (prefiero tener esto claro antes de tratar de pasar a la línea 4)

Alastor8890

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Ejemplo función malloc en C
« Respuesta #3 en: 19 de Julio 2012, 02:19 »
la n dentro de la función malloc sirve para hacer en ese ejemplo asignación de memoria de la cantidad de caracteres que se quiere; en efecto se pide el valor de n para que se sepa cuántos caracteres tendrá la cadena, seguido esto se multiplica n*sizeof(char) para hacer la reserva en cantidad de memoria de n caracteres:

por ejemplo si la cadena tendrá 10 caracteres y se quiere reservar memoria dinámicamente entonces la función será:

char* p;
n=10;
p=(char*)malloc(n*sizeof(char)); /*Reserva memoria para 10 caracteres*/

Mayen Olivares

  • Sin experiencia
  • *
  • Mensajes: 48
    • Ver Perfil
Re:Ejemplo función malloc en C
« Respuesta #4 en: 24 de Julio 2012, 11:09 »
Gracias Alastor, entonces por lo que entiendo malloc nos sirve para reservar un espacio de memoria para una variable referenciada por un puntero. Pero ¿esas variables p ó s sobre las que has realizado la asignación tienen algún contenido? Me refiero al si al escribir

p=(char*)malloc(n*sizeof(char)); /*Reserva memoria para 10 caracteres*/

¿La variable p tiene algún contenido como diez caracteres vacíos o su contenido es null?

IvanPavka

  • Sin experiencia
  • *
  • Mensajes: 4
    • Ver Perfil
Re:Ejemplo función malloc en C
« Respuesta #5 en: 19 de Diciembre 2012, 01:18 »
Mayem! hola! Te cuento la función malloc lo que hace es asignar memoria para una variable tipo puntero! se utiliza esta función con el archivo de cabecera alloc.h

es el caso que te puso alastor, s es un puntero a carácter (puede ser int, float, double, etc) y para le p la explicación es la misma,

p=(char*)malloc(n*sizeof(char));

en esta expresión, malloc va a asignar, cada 2bites de memoria "...sizeof(char)...", un tamaño 'n' de memoria. la expresión "(char*)" es la función "cast" esta función convierte cualquier tipo de dato a otro tipo de dato, (en este caso convierte a un tipo de dato carácter).

me explico?
un abrazo

Mayen Olivares

  • Sin experiencia
  • *
  • Mensajes: 48
    • Ver Perfil
Re:Ejemplo función malloc en C
« Respuesta #6 en: 19 de Diciembre 2012, 17:13 »
Hola iván, gracias por responder  :D Te cuento: estoy intentando ejecutar esto:

#include <stdio.h>
#include <stdlib.h>
//#include <malloc.h>

int main(){

int n;
char* puntcadena;
printf("Ingrese el numero de caracteres de la cadena:");
scanf("%d",&n);
puntcadena=(char*)malloc(n*sizeof(char));
printf("\nSe ha reservado espacio de memoria para %d caracteres", &n);
printf("\nIngrese la cadena:");
scanf("%s", &*puntcadena);
printf("El valor almacenado en la variable de la cadena es %s", &*puntcadena);

return 0;
}

Tengo un par de problemas:

Primer problema, que si dejo la línea #include <malloc.h> me salta un error de compilación.

Segundo problema: si dejo esa línea comentada, me compila pero al ejecutar me pasa por ejemplo esto

Ingrese el numero de caracteres de la cadena: 3

Se ha reservado espacio de memoria para 2293564 caracteres

Ingrese la cadena

Pero claro, ¡yo lo que esperaba era que me dijera que se había reservado espacio de memoria para 3 caracteres, no sé de donde sale el 2293564!

IvanPavka

  • Sin experiencia
  • *
  • Mensajes: 4
    • Ver Perfil
Re:Ejemplo función malloc en C
« Respuesta #7 en: 19 de Diciembre 2012, 18:40 »
Hola Mayen! mira, hay varios problemitas.


1ro) La función de biblioteca es alloc.h, no malloc.h
2do)"..printf("\nSe ha reservado espacio de memoria para %d caracteres", &n);.."
       lo que estas haciendo ahí es que se muestre la dirección que se le asigno en
       memoria a la variable n. Esa es la función que tiene el operador &. si le borras
       el "&" te mostrará el numero que ingresaste.
3ro) Cuando haces referencia al puntero en las funciones printf y scanf deben ir sin el
       operador indirección (*)
4to) Cuando vas a capturar la cadena de caracteres que ingresaste en scanf, debes
       tipear:  "..scanf("%[^\n]",var);.." eso significa que va a capturar todo lo que
       escribas, menos el carácter de nueva línea(\n). y cuando especificas la variable
       en donde guardarás la cadena, esta va sin el operador &. Este operador lo usas
       únicamente para los tipo de datos enteros, flotantes y cuando solo guardas un solo
       carácter.
 
Espero que me entiendas. je  :P

Acá te pongo el código con las correcciones que te explique mas arriba.

#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>

int main(){

int n;
char *puntcadena;
printf("Ingrese el numero de caracteres de la cadena:");
scanf("%d",&n);
getchar();
puntcadena=(char*)malloc(n*sizeof(char));

printf("\nSe ha reservado espacio de memoria para %d caracteres", n);

printf("\nIngrese la cadena:");
scanf("%[^\n]",puntcadena);


printf("El valor almacenado en la variable de la cadena es %s", puntcadena);

return 0;
}


Si habrás notado, hay un "getchar();" use getchar(); para liberar el buffer de memoria, porque en esa parte del programa cuando presiono la tecla enter, el buffer se queda con el carácter de nueva línea en memoria, y me salta las otras expresiones y no me deja hacer nada. si no comprendes bien lo que te explico, proba sacando getchar(); ejecuta y fíjate que pasa, luego volvele a poner getchar() y proba, a ver que pasa  :)

Cualquier duda consultame, y trataremos de solucionar =)

Mayen Olivares

  • Sin experiencia
  • *
  • Mensajes: 48
    • Ver Perfil
Re:Ejemplo función malloc en C
« Respuesta #8 en: 20 de Diciembre 2012, 11:12 »
Te agradezco que me estés echando una mano  ;D

Hay una cosa que no acabo de entender. Me comentas

3ro) Cuando haces referencia al puntero en las funciones printf y scanf deben ir sin el
       operador indirección (*)


Por ejemplo aquí:

printf("\nIngrese la cadena:");
scanf("%[^\n]",puntcadena);

printf("El valor almacenado en la variable de la cadena es %s", puntcadena);

En el scanf sí veo lógico escribir puntcadena sin más, puesto que puntcadena es un puntero que contiene la dirección de memoria donde está alojada la variable. En teoría sería lo mismo que hacer scanf("%[^\n]", &*puntcadena); pero esto último sería un poco tonto, porque sería como rescatar el contenido de la posición de memoria con * para luego volver a obtener la posición de memoria usando &.

En cambio aquí no lo veo tan lógico: printf("El valor almacenado en la variable de la cadena es %s", puntcadena); porque si puntcadena es un puntero, esta instrucción la veo como si estuviéramos diciendo que nos imprima por pantalla un puntero, y un puntero es una referencia a una posición de memoria y esto no tendría sentido imprimirlo por pantalla, aquí lo que yo vería lógico sería desreferenciar el puntero así: printf("El valor almacenado en la variable de la cadena es %s", *puntcadena); de esta manera lo que imprimiríamos por pantalla es el contenido de la variable a la que apunta el puntero. ¿No es así?

Espero no haberme liado demasiado


IvanPavka

  • Sin experiencia
  • *
  • Mensajes: 4
    • Ver Perfil
Re:Ejemplo función malloc en C
« Respuesta #9 en: 20 de Diciembre 2012, 17:08 »
claro, te entiendo, pero no hace falta, porque el compilador te va a mostrar el contenido del puntero, porque vos lo que tenes ahí es un puntero a un grupo contiguo de arrays, y el nombre del array es un puntero al primer elemento del array, y bueno el compilador esta programado que para en los arrays, y tmb en estructuras, te muestre el dato y no la dirección! me captas?

Mayen Olivares

  • Sin experiencia
  • *
  • Mensajes: 48
    • Ver Perfil
Re:Ejemplo función malloc en C
« Respuesta #10 en: 22 de Diciembre 2012, 13:30 »
Sí que te capto, me queda claro, si el compilador lo hace así pues así será. Ahora el problema que tengo es que cuando intento compilar el código que me has pasado tú me aparece un error:

PruebaForo4.cpp Línea 8 Columna 6. Elemento no esperado. Se esperaba:   Id |

El caso es que si comento la línea #include <alloc.h> el programa sí compila y logro ejecutarlo. Estoy usando code::blocks pero como lo instalé hace bastante tiempo y he estado cacharreando con los archivos de sistema a lo mejor lo tengo dañado y quizás lo mejor es que me lo instale otra vez.

Pero también me he ido a compiladores on-line y también me dicen que el código no es compilable, por ejemplo el compilador on-line codepad me dice Line 18: error: alloc.h: No such file or directory.

¿Con qué programa estás compilando y ejecutando tú?

Si dejo la línea comentada el resultado no me parece bueno. Por ejemplo si hago esta ejecución:

Ingrese el numero de caracteres de la cadena:3

Se ha reservado espacio de memoria para 3 caracteres
Ingrese la cadena:paco
El valor almacenado en la variable de la cadena es paco
Pulsar cualquier tecla para continuar.


Si he reservado espacio para 3 caracteres no creo debiera mostrar paco, sino pac.

IvanPavka

  • Sin experiencia
  • *
  • Mensajes: 4
    • Ver Perfil
Re:Ejemplo función malloc en C
« Respuesta #11 en: 25 de Diciembre 2012, 19:01 »
Bueno mira, yo compilo con Turbo c++ 3.1 y no tengo errores, la verdad que es raro eso, tendría que ver tu código. Vos sabes que a mi me pasa, a veces, que cuando uso una constante y no la inicializo en 0 (cero), se asigna el espacio en memoria y queda con datos "basura" que le dicen, y cuando quiero mostrar o realizar alguna operación matemática, me aparase cualquier resultado jajajaja. proba inicializando la constante! Saludos! Y felices fiestas!

Mayen Olivares

  • Sin experiencia
  • *
  • Mensajes: 48
    • Ver Perfil
Re:Ejemplo función malloc en C
« Respuesta #12 en: 27 de Diciembre 2012, 13:33 »
Hola!!! Igualmente felices fiestas!!! Al ver tu respuesta he caído en que al estar usando code::blocks, este entorno y compilador tiene integrada tanto la compilación en c como en c++. Yo estaba compilando en C, ahora al ver tu respuesta y que estabas utilizando c++ he pensado que probablemente sea debido a esto. c y c++ son muy parecidos pero tambien hay algunas pequeñas diferencias y a lo mejor es eso lo que me estaba ocurriendo, voy a intentar investigarlo a ver si efectivamente era eso, porque es muy raro que el mismo código compile y se ejecute en un entorno y en otro no. Voy a ir haciendo pruebas. Saludos!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".