2017-01-30 7 views
0

Может кто-нибудь указать на проблему с этим кодом (для изменения размера динамического массива). Я использую Visual Studio 2013 для запуска кода. Он дает ошибку времени выполнения, то есть heap corruption detected after normal block (a number) at (memory address). CRT detected that the application wrote to the memory after the end of heap buffer. Я использовать технику упомянутых ниже, а не какой-либо стандартной функции библиотеки или вектор для изменения размера массива:Изменение размеров динамических массивов

#include<iostream> 
using namespace std; 

int * rg(int *, int, int); 

int main() 
{ 
    int len = 1; 
    int * x = new int[len]; 

    int i = 0; 
    int y = 0; 
    while (getchar() != 'q') 
    { 
     cin >> y; 
     if (i == 0) 
      x[0] = y; 
     else 
     { 
      x = rg(x, len, y); 
      len++; 
     } 
     cout << len; 
     i++; 
    } 

    cout << endl; 
    for (int i = 0; i < len; i++) 
    { 
     cout << x[i] << endl; 
    } 
} 

int * rg(int*x, int len, int val) 
{ 
    int * temp = x; 
    x = new int[]; 
    for (int i = 0; i < len; i++) 
    { 
     x[i] = temp[i]; 
    } 
    x[len] = val; 

    delete[]temp; 

    return x; 
} 
+4

Вы не используете информацию о длине для создания нового 'x'. Также попробуйте правильно отформатировать код, чтобы мы могли легче видеть, что происходит. – Matthias247

+6

Всякий раз, когда вы думаете о «динамических массивах» при программировании на C++, ваша следующая мысль должна * всегда * быть ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector). Использование стандартной библиотеки и ее классов и функций сделает вашу жизнь программистом на C++ * так * намного проще. –

+3

Это домашнее задание? Если не использовать std :: vector. –

ответ

3
x = new int[]; 

недопустим в качестве стандартного C++ и не должны компилировать.

2

Вы не указали библиотеку, которая имеет getchar. Добавить #include <cstdio> в начале.

Во-вторых, после захвата первого номера вы не увеличиваете len, что заставляет второй вход перезаписывать первый. Последний вход удваивается в конце.

В-третьих. При распределении памяти компилятор должен знать, сколько он должен выделять. Вы должны указать это в x = new int[].

Смежные вопросы