2015-03-13 2 views
-3

Вот мой кодОшибка при инициализации динамически выделяемый массив

#include <iostream> 
using namespace std; 

void Initalize(int* p, int n) { 
    p = new int[n]; 
    for (int i = 0; i < n; ++i) { 
     p[i] = 5; 
    } 
} 

int main() { 
    int n = 3; 
    int* p = new int[n]; 
    for (int j = 0; j < 2; ++j) 
     for (int i = 0; i < n; ++i) { 
      Initalize(p, n); 
      p[i] += 5; 
     } 
    cout << p[0] << " " << p[1] << " " << p[2] << endl; 
    return 0; 
} 

Когда я запускаю этот код первые два значения, которые я получаю мусор, а последний всегда 10. Как я могу это исправить?

ответ

2

Линия Initalize(p, n); не имеет эффекта, кроме утечки некоторой памяти.

У линии p[i] += 5; есть неопределенное поведение, так как вы читаете из неинициализированного значения.

Если вы удалили строку p = new int[n]; из функции Initialize, ваш код будет работать, и, возможно, даже делать то, что вы ожидаете — в зависимости от ваших ожиданий, конечно (почему ты звонишь Initialize в цикле?).

1

первые два значения, которые я получаю мусор, а последний всегда 10

На самом деле, 10 мусор, а также: значение n, что вы передаете Initialize не имеет значения, потому что функция выделяет и утешает новый массив каждый раз, когда вы проходите через эту функцию.

Чтобы исправить эту программу, измените значение Initialize, чтобы вернуть новый массив, и удалите инициализацию до new int[n] от main.

int *Initalize(int n) { 
    int *p = new int[n]; 
    for (int i = 0; i < n; ++i) { 
     p[i] = 5; 
    } 
    return p; 
} 
... 
int *p = Initalize(n); 
cout << p[0] << " " << p[1] << " " << p[2] << endl; 
p[i] += 5; 
cout << p[0] << " " << p[1] << " " << p[2] << endl; 
delete[] p; 
0
void Initalize(int* p, int n) { 

    p = new int[n]; 
    ^
    | 
    | 

Этот парень здесь является виновником. Вам не нужно повторно инициализировать здесь. Снимите это, и отсюда потекут.

0

Вы инициализируете массив дважды. Если вам не нужен двумерный массив, вы должны удалить его. Если вы пытаетесь инициализировать двумерный массив, то p в функции main должен указывать на массив, а не на одно целое число.

Как указывалось другими, вы также просачиваете память, инициализируя это, а затем переназначая его.