0

He diseñado un programa el cual almacene los números en un vector, y detendrá dicho almacenamiento cuando el usuario escriba la palabra "fin", la cuestión está en que no tengo idea el por qué en la posición #9 de mi código, retorna un número basura, incluso le pedí ayuda a mi profesor y no tiene idea el por qué.

Este es mi código:

#include <iostream>
#include <string>
using namespace std;
int main() {
 int* vector = new int[0];
 string numero="";
 int tamanio = 0;
 char verificador = 'b';

 while(verificador != 'a'){
   getline(cin,numero); // Siempre el componente #9 genera un número basura, y no entiendo el por qué y cómo quitarlo o evitar que eso pase
   if(numero == "fin") verificador = 'a';
   else{
     int numeroInt = atoi(numero.c_str());
     vector[tamanio] = numeroInt;
     tamanio++;
   }
 }

 for(int i=0; i<tamanio; i++){
   cout<<vector[i]<<" ";
 }

 delete [] vector;
 return 0;
}

Gracias por su ayuda

Elmo Lawliet
  • 165
  • 1
  • 7
  • Se ve que estáis los 2 en el mismo colegio o algo: [Error: Main malloc.cp en array dinamico de enteros](https://es.stackoverflow.com/q/407405/149531) – Juanjo Nov 17 '20 at 16:30
  • No, no es el mismo error, imprime común y corriente, el problema está que al imprimir, siempre en al posición #9 retorna un número basura (de 5 o 6 dígitos) que nada tienen que ver con el número que insertaría – Elmo Lawliet Nov 17 '20 at 16:52
  • ¿¿ Que no es el mismo error ?? ¿¿ En serio ?? Yo llevo gafas, y aún así lo veo **muy claramente**: `int* vector = new int[0];`. – Juanjo Nov 17 '20 at 16:57

1 Answers1

0

Lo raro es que te funcione algo en ese programa, está mal desde la primera instrucción de main:

int* vector = new int[0];

En esa línea solicitas memoria para almacenar CERO enteros. ¿Cuántos enteros caben en un vector de cero elementos?: Ninguno.

Eso significa que cada vez que accedes a vector estás accediendo fuera de la memoria solicitada, lo cuál es comportamiento indefinido y hará que el programa se comporte de manera errática: podría funcionar, podría fallar, podría funcionar o fallar aleatoriamente o podría invocar demonios que saldrían disparados de tus fosas nasales.


Si quieres un contenedor de datos que crezca dinámicamente, usa una std::list o un std::vector, según se ajuste a tus necesidades.

Si quitamos todo lo innecesario de tu código, corregimos los errores y lo reescribimos siguiendo las recomendaciones de C++ moderno, tu código podría parecerse a:

#include <string>
#include <list>
#include <sstream>

int main()
{
    using namespace std;

    list<int> datos;
    string dato{};

    while (getline(cin, dato) && dato != "fin")
    {
        stringstream dd{dato};
        int valor;

        if (dd >> valor)
            datos.push_back(valor);
        else
            cout << dato << " no es un numero\n";
    }

    for (const auto &valor : datos)
        cout << valor << ' ';

    return 0;
}

Puedes ver el código funcionando en Try it online!.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82