elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con asignación dinamica de memoria.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con asignación dinamica de memoria.  (Leído 4,674 veces)
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Problema con asignación dinamica de memoria.
« en: 2 Febrero 2013, 23:44 pm »

Código:
//includes
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
//globales
struct alumno
{
string nombre;
string apellido;
};
struct alumno info;
//prototipo de funciones

//funcion main



int main()
{
float aux=0;
int contador=0;
float *notas=NULL;


cout<<"Nombre del alumno : "  ; cin>>info.nombre;
cout<<endl<<"Apellido del alumno : " ; cin>>info.apellido;
cout<<endl;
cout<<"Ingrese las notas y presione entrar,para terminar el ingreso de datos use 0.."<<endl;
do
{
cout<<"nota numero " << contador+1 << " : " ;cin>>aux;
notas=(float*)realloc(notas,sizeof(float)*contador);
notas[contador]=aux;
contador++;
}
while(aux!=0);


free(notas);
}

estaba haciendo programa , el siguiente :

Citar
Escriba un programa que lea los datos de un alumno:nombre, apellido, y una lista de calificaciones correspondiente a todos sus exámenes finales (se desconoce a priori el número de exámenes rendidos). El programa debe calcular el promedio del alumno en la carrera en informarlo en pantalla.

al introducir mas de 5 notas, me tira error de ...

*** glibc detected *** /home/mmokk/Escritorio/dinamico: realloc(): invalid next size: 0x08fc30a8 ***

lei que cuando el puntero es NULL , la funcion realloc funciona como malloc, después cuando el puntero tiene asignada una direccion de memoria que apunta a la memoria , después de 5 notas sale el error descrito arriba.

Compilo bajo ubuntu linux con g++ ..

Alguien puede ayudarme ?.

Gracias de antemano  :P


En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Problema con asignación dinamica de memoria.
« Respuesta #1 en: 3 Febrero 2013, 01:21 am »

Estás reservando un elemento menos en cada iteración:

Código
  1. notas=(float*)realloc(notas,sizeof(float)*contador);

En la primera iteración contador es cero estás reservando cero bytes... deberías hacer "contador + 1" ya que necesitas reservar espacio para contador+1 elementos.

EDIT:

No había leído el enunciado del problema, no hace falta utilizar memoria dinámica, simplemente puedes ir sumando las notas y llevar un contador de las notas que ha ido introduciendo y luego sacas la media con eso.


« Última modificación: 3 Febrero 2013, 01:37 am por naderST » En línea

ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Problema con asignación dinamica de memoria.
« Respuesta #2 en: 3 Febrero 2013, 01:35 am »

Estás reservando un elemento menos en cada iteración:

Código
  1. notas=(float*)realloc(notas,sizeof(float)*contador);

En la primera iteración contador es cero estás reservando cero bytes... deberías hacer "contador + 1" ya que necesitas reservar espacio para contador+1 elementos.
Perfecto gracias , pero aunque a contador lo inicialize en 1 como acabo de hacer, en vez de a los 5 , a las 4 notas surge el siguiente error..

*** glibc detected *** /home/mmokk/Escritorio/Programacion/dinamico: realloc(): invalid next size: 0x08b820a8 ***
En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Problema con asignación dinamica de memoria.
« Respuesta #3 en: 3 Febrero 2013, 01:38 am »

Perfecto gracias , pero aunque a contador lo inicialize en 1 como acabo de hacer, en vez de a los 5 , a las 4 notas surge el siguiente error..

*** glibc detected *** /home/mmokk/Escritorio/Programacion/dinamico: realloc(): invalid next size: 0x08b820a8 ***


Si lo inicias en uno debes asegurarte de cuando accedas a un elemento del arreglo lo hagas de la siguiente manera:

notas[contador-1]=aux;

ya que el arreglo va de 0 a n-1
En línea

ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Problema con asignación dinamica de memoria.
« Respuesta #4 en: 3 Febrero 2013, 01:52 am »

Mi problema se soluciono . muchisimas gracias (:
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Problema con asignación dinamica de memoria.
« Respuesta #5 en: 3 Febrero 2013, 03:46 am »

Una cosa, en C++ tienes el operador new/delete para reservar dinámicamente la memoria, no necesitas el alloc:

Código
  1. notas = new float[contador];
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Problema con asignación dinamica de memoria.
« Respuesta #6 en: 3 Febrero 2013, 04:19 am »

Una cosa, en C++ tienes el operador new/delete para reservar dinámicamente la memoria, no necesitas el alloc:

Código
  1. notas = new float[contador];

Gracias .. se que se escapa del tema pero... si uso

Código
  1. notas=new float[contador];
  2. notas=new float[contador*2];


el segundo new funcionaria como realloc ? como haria la reasignación de memoria cuando ya invoque a new antes ?

saludos
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Problema con asignación dinamica de memoria.
« Respuesta #7 en: 3 Febrero 2013, 12:09 pm »

Gracias .. se que se escapa del tema pero... si uso

Código
  1. notas=new float[contador];
  2. notas=new float[contador*2];


el segundo new funcionaria como realloc ? como haria la reasignación de memoria cuando ya invoque a new antes ?

saludos
Cada llamada a new, reserva una porción de memoria y te devuelve el puntero con la dirreción.

Si pones dos llamadas seguidas, harán lo mismo, pero al hacer la segunda perderías la dirreción de la anterior y tendrías una fuga de memoria:
http://www.youtube.com/watch?v=Y9eYr8zGGIg

Tienes que borrar la memoria cogida antes de hacer un nuevo new:
Código
  1. notas=new float[contador];
  2. delete[] notas;
  3. notas=new float[contador*2];


Para más información:
http://c.conclase.net/curso/index.php?cap=013b
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema con asignación dinamica de memoria.
« Respuesta #8 en: 3 Febrero 2013, 17:31 pm »

se que se escapa del tema pero... si uso

Código
  1. notas=new float[contador];
  2. notas=new float[contador*2];


el segundo new funcionaria como realloc?
No.

como haria la reasignación de memoria cuando ya invoque a new antes ?
En C++ evitas la reasignación, en su lugar utilizas un contenedor, por ejemplo la clase vector.

Un saludo
En línea

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
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Problema con asignación dinamica de memoria.
« Respuesta #9 en: 4 Febrero 2013, 00:56 am »

Citar
No había leído el enunciado del problema, no hace falta utilizar memoria dinámica, simplemente puedes ir sumando las notas y llevar un contador de las notas que ha ido introduciendo y luego sacas la media con eso.

es verdad.solo lo hice de practica..

Gracias por sus ayudas.. me sirvieron . UN SALUDO !
« Última modificación: 4 Febrero 2013, 00:57 am por Puredepapas » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines