Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
linuxdesk
3 / 3 / 2
Регистрация: 25.03.2015
Сообщений: 26
#1

Создание динамического массива - C++

27.03.2015, 03:47. Просмотров 543. Ответов 3
Метки нет (Все метки)

Добрый день! Хочу выделить память под массив, только после того как буду знать его длину. Длину вычисляю в функции. Память под массив выделяю там же.
Но при возврате в main() при обращении в массиву выдает ошибку: "Необработанное исключение типа "System.NullReferenceException" произошло в test.exe"
Честно сказать не понимаю, что происходит. С одной стороны это указатель, и с ним ничего не должно происходить. С другой стороны, память отведенная под массив, может (или должна) очищаться после завершения функции. Объясните, пожалуйста, что не так. Может код, может что-то другое.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
void ArrayBuilder(int *Array, int &lenght){
//значение lenght вычисляется внутри функции. допустим 4
    lenght = 4;
    Array=new int[lenght];
}
void main(){
    int i=0;
    int * p=0;
    ArrayBuilder(p, i);}

Как вариант вижу следующее ниже решение, но очень хочется понять что не так с первым.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void ArrayBuilder(int *Array, int &lenght)
{
    //вычисляем значение, допустим 4
    lenght = 4;
    Array[0]=Array[1]=Array[2]=Array[3]=0;
}
void main(){
    int i=0;
    int * p2=new int[500];
    ArrayBuilder(p2, i);
    int * p1 = new int[i];
    for(int j=0; j<i; j++)
    {p1[j]=p2[j];}
    delete[] p2;
}

http://www.cyberforum.ru/cpp-beginners/thread13625.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2015, 03:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Создание динамического массива (C++):

Создание динамического массива
Объявите указатель на массив типа double и предложите пользователю выбрать его...

Создание динамического массива
Как объявить вот так вот : int blocks = { {0,0,0,0,0,0}, {0,0,0,0,0,0},...

Создание динамического массива
Как создать динамически массив размера n если n вводиться с клавиатуры. А еще и...

Создание динамического массива
Добрый вечер! Подскажите пожалуйста, что необходимо сделать, чтобы заменить...

Создание динамического массива
Ребята подскажите пожалуйста не давно начал изучать С++ ,решил добавить еще ...

3
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
27.03.2015, 04:38 #2
Лучший ответ Сообщение было отмечено linuxdesk как решение

Решение

Указатель нужно по ссылке передать в функцию:
C++
1
2
3
4
5
6
7
8
9
10
void ArrayBuilder(int *&Array, int &lenght){
//значение lenght вычисляется внутри функции. допустим 4
    lenght = 4;
    Array=new int[lenght];
}
void main(){
    int i=0;
    int * p=0;
    ArrayBuilder(p, i);
}
Добавлено через 2 минуты
Если передавать по значению, то передаётся копия указателя, изменения которой в функции, никак не повлияют на значение оригинала указателя в main.
1
RefSol
486 / 232 / 71
Регистрация: 31.10.2010
Сообщений: 688
27.03.2015, 11:03 #3
linuxdesk, привет!
Одномерный массив, выделение и очистка памяти :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main() {// функция входа в программу на C++
  // объявление указателя и переменных
  char* arr1d;             // указатель
  unsigned int Xsize = 16; // размер массива
  // выделение памяти под массив
  arr1d = new char[Xsize];
  // инициализация нулём
  memset(arr1d, 0, Xsize * sizeof(char));
 
  //...
  // какие-то действия
 
  // чистим память
  if( arr1d ) {    
    // если указатель не нулевой
    delete[]arr1d;// удаляем массив
    arr1d = 0;    // обнуляем указатель
  }
  // выход
  return 0;
}
Двумерный массив, выделение и очистка памяти :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int main() {   // функция входа в программу на C++
  // необходимые указатели и переменные
  char** arr2d;// объявление указателя указателей 
               //  на массивы типа char
  unsigned int Xsize = 32; // размеры массива (X)
  unsigned int Ysize = 32; // размеры массива (Y)
  // выделение памяти для массива массивов
  arr2d = new char*[Ysize]; // для указателей
  for (unsigned int i = 0; i < Ysize; i++) {
    arr2d[i] = new char[Xsize]; // для данных
    // инициализация памяти нулём
    memset(arr2d[i], 0, Xsize * sizeof(char));
  }
  // ...
  // какие-то действия 
  // обращение к элементам двумерного массива  // может быть такое: 
  //  arr2d[y][x], y=0...Ysize-1, x=0...Xsize-1 
  // ...
  // чистим память
  if( arr2d ) { // если указатель не нулевой
    for (unsigned int i = 0; i < Ysize; i++)
      delete[]arr2d[i]; // массивы данных
    delete[]arr2d;      // массив указателей
    arr2d = 0;          // обнуляем указатель
  }
  return 0;     // выход
}
0
linuxdesk
3 / 3 / 2
Регистрация: 25.03.2015
Сообщений: 26
27.03.2015, 13:57  [ТС] #4
Цитата Сообщение от lss Посмотреть сообщение
Указатель нужно по ссылке передать в функцию:
Большое спасибо за помощь!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2015, 13:57
Привет! Вот еще темы с решениями:

Создание динамического массива
объясните пожалуйста вот эту часть // sozdanie dinamicheskogo massiva m*n...

Создание динамического массива
Хотел написать программу, чтобы пользователь мог задать количество элементов в...

Создание динамического массива
const int Num=5; const int SIZE=4096 * Num; SHORT Buf; как такое...

Создание и вывод динамического массива
Как вывести на экран динамический массив? #include&lt;iostream&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru