Форум программистов, компьютерный форум CyberForum.ru

Почему массив изначально нулями не инициализируется? - C++

Восстановить пароль Регистрация
 
motr
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 6
19.09.2013, 21:49     Почему массив изначально нулями не инициализируется? #1
Всем доброго вечера. Имеется проблема такая проблема: есть массив, в котором количество элементов должно менять при выполнении условия. Я делаю так:
C++
1
2
3
4
5
6
7
8
n=1;
double *a = new double [n];
scanf ("%i",b);
if (b==1)
{
n++;
double *a = new double [n];
//потом что то с ним делаю
Возможен ли такой вариант, чтобы элементы из предыдущего массива оставались (их потом мне нужно будет в файл записывать)?
И еще вопрос: почему массив изначально нулями не инициализируется?
Какие есть еще пути решения?
Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
19.09.2013, 22:01     Почему массив изначально нулями не инициализируется? #2
1. Элементы в массиве остаются пока не будет удален массив или его элементы.
2.Динамический массив нельзя инициализировать по определению.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
19.09.2013, 22:07     Почему массив изначально нулями не инициализируется? #3
Цитата Сообщение от motr Посмотреть сообщение
Всем доброго вечера. Имеется проблема такая проблема: есть массив, в котором количество элементов должно менять при выполнении условия. Я делаю так:
ты не путай динамический массив, к которому относится vector и динамическое выделение памяти
если ты сам хочешь сделать динамический массив то или используй Сишные malloc(выделение) free(освобождение) realoc(перераспределение увеличить\уменьшить)
если хочешь делать через new delete
то при перераспределении памяти шаги такие
1 выделить новый массив нужного размера
2 переписать все значения из первого массива в выделенный
3 удалить первый массив
4 указатель на первый массив присвоить значения чтобы он указывал на новый
motr
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 6
19.09.2013, 22:12  [ТС]     Почему массив изначально нулями не инициализируется? #4
Спасибо за разъяснение!
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.09.2013, 22:13     Почему массив изначально нулями не инициализируется? #5
Цитата Сообщение от ValeryS Посмотреть сообщение
если ты сам хочешь сделать динамический массив то или используй Сишные malloc(выделение) free(освобождение) realoc(перераспределение увеличить\уменьшить)
если хочешь делать через new delete
то при перераспределении памяти шаги такие
1 выделить новый массив нужного размера
2 переписать все значения из первого массива в выделенный
3 удалить первый массив
4 указатель на первый массив присвоить значения чтобы он указывал на новый
Не слушайте эту лабуду и используйте vector.
C++
1
2
3
4
5
6
7
8
n=1;
std::vector<double> a(n); // и инициализируется нулями
scanf ("%i", &b);
if (b==1)
{
    a.resize(a.size() + 1);
    // и дальше с ним что-то делаете
}
Извиняюсь, если обидел мазохистов.
motr
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 6
19.09.2013, 23:02  [ТС]     Почему массив изначально нулями не инициализируется? #6
OhMyGodSoLong, у меня еще проблема возникла.
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
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <iostream>
#include <vector>
 
int main()
{
    //double a;
    int n;
    int i; 
    n=10;
    //double *a = new double [n];
    int b=0;
    
    std::vector<double> a(n); // и инициализируется нулями
 
if (b==1)
{
    a.resize(n + 1);
 
    // и дальше с ним что-то делаете
    for(i=0;i<a.size();i++)
    
    printf ("%d",a[i]; )
 
  return 0;}
 
 
scanf("%i",b);
}
Хочу все это на экран вывести. В чем косяк?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.09.2013, 00:03     Почему массив изначально нулями не инициализируется? #7
Наверное, в том, что точку с запятой надо ставить после скобки, а не до?..
motr
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 6
20.09.2013, 11:41  [ТС]     Почему массив изначально нулями не инициализируется? #8
OhMyGodSoLong, я пока исправлял случайно ошибся, не в этом проблема.

Добавлено через 3 часа 0 минут
попытался сделать через malloc.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main ()
{
int i, n,b;
n=10;
 
double *a = (double*) malloc (sizeof(double)*n);
 
for (i=0;i<n;i++){ a[i]=5;}
scanf ("%i",&b);
if (b==1)
{
    n++;
    a[9]==2;
for (i=0;i<n;i++)
{
    printf ("a[i]= %d\n",a[i]);
}
}
getch();
 
}
почему он не заполняет все элементы 5ками, а 9й - 2кой?
Algoritmer
 Аватар для Algoritmer
155 / 95 / 13
Регистрация: 07.03.2013
Сообщений: 477
Записей в блоге: 1
20.09.2013, 12:02     Почему массив изначально нулями не инициализируется? #9
motr, вот Ваш измененный код из первого сообщения
Если о сохранении данных заботиться не нужно, тогда так:
C++
1
2
3
4
5
6
7
8
n=1;
double *a = new double [n];
scanf ("%i",b);
if (b==1)
{
   n++;   
   a = new double [n]; //убрал повторное объяление типа, т.к. в этом случае создается новая переменая, область //видимости к-рой заканчивается с концом фигуных скобок if
}
Если же заботиться о сохранении данных, тогда так
C++
1
2
3
4
5
6
7
8
9
10
11
n=1;
double *a = new double [n];
scanf ("%i",b);
if (b==1)
{
   n++; 
   double *a2=a;  
   a = new double [n]; 
   for(int i=0;i<n-1;i++) a[i]=a2[i];
   delete []a2;
}
Добавлено через 9 минут
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Не слушайте эту лабуду и используйте vector.
C++
1
2
3
4
5
6
7
8
n=1;
std::vector<double> a(n); // и инициализируется нулями
scanf ("%i", &b);
if (b==1)
{
    a.resize(a.size() + 1);
    // и дальше с ним что-то делаете
}
Извиняюсь, если обидел мазохистов.
motr, если Вам задали лабу в универе и она на использование массивов, то вариант с типом vector у Вас скорей всего не примут. Смотрите приведенный мной вариант.
motr
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 6
20.09.2013, 12:40  [ТС]     Почему массив изначально нулями не инициализируется? #10
Algoritmer, попробовал, как Вы написали:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main ()
{
int i, n,b;
 
n=10;
double *a = new double [n];
 
for (i=0;i<=n;i++){ a[i]=0; printf ("%d\n",a[i]);}
scanf ("%i",&b);
if (b==1)
{
   n++; 
   double *a2=a;  
   a = new double [n]; 
   i=5;
   a2[i]=9;
   a[i+1]==6;
  
   for(i=0;i<n;i++){ a[i]=a2[i]; printf ("%d\n",a[i]);}
   
}
getch();
}
не могу понять, почему у меня на выходе 2 нулевых массива.
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
20.09.2013, 12:48     Почему массив изначально нулями не инициализируется? #11
Цитата Сообщение от motr Посмотреть сообщение
for (i=0;i<=n;i++)
тут небольшая ошибка. элементы в массиве a нумеруются от 0 до n-1. a[n] находится за массивом и записывать в этот адрес нельзя потому что будут затёрты чужие данные
правильно будет так:
C++
1
for (i=0;i<n;i++)
motr
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 6
20.09.2013, 13:02  [ТС]     Почему массив изначально нулями не инициализируется? #12
_, но на выходе массив a[n] все равно остается нулевым кроме последнего добавленного элемента. а по идее в 5й ячейке должно быть число.
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
20.09.2013, 13:19     Почему массив изначально нулями не инициализируется? #13
motr, я не знаю в чем дело. программа немного запутана. и вот эта строчка:
C++
1
2
double *a2=a;  
a = new double [n];
что здесь происходит и не получится ли что после new два массива будут указывать на одну память?
Algoritmer
 Аватар для Algoritmer
155 / 95 / 13
Регистрация: 07.03.2013
Сообщений: 477
Записей в блоге: 1
20.09.2013, 15:47     Почему массив изначально нулями не инициализируется? #14
motr, а что должно получиться?
Прокомментирую Ваш код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main ()
{
int i, n,b;
 
n=10;
double *a = new double [n];
 
for (i=0;i<=n;i++){ a[i]=0; printf ("%d\n",a[i]);} //заполняется массив нулями и выводится на экран
scanf ("%i",&b);
if (b==1) 
{
   n++; 
   double *a2=a;  //запоминаешь указатель на исходный массив
   a = new double [n]; //создаешь новый
   i=5;
   a2[i]=9; //записываешь "9" в 5-ю позицию (a2[0] считаем нулевой позицией) исходного массива (кстати попробуй поменять "9" на "9.0"
   a[i+1]==6; зачем-то сравниваешь 6-ю позицию новосозданного массива, к-рый у тебя ещё не проинициализирован, с "6" (разумеется результат сравнения "false") и более того, результат сравнения ты никак дальше не используешь
  
   for(i=0;i<n;i++){ a[i]=a2[i]; printf ("%d\n",a[i]);} //здесь копирование массива и вывод на экран, но в цикле должна быть проверка i<[B]n-1[/B] вместо i<[B]n[/B], так как a2 на единицу короче
   
}
getch();
}
По идее, если строка 19 не вызовет исключение "выход за пределы памяти", (смотри комментарий к ней), она должна вывести: 0 0 0 0 0 9 0 0 0 0 0

Добавлено через 4 минуты
Цитата Сообщение от _ Посмотреть сообщение
motr, я не знаю в чем дело. программа немного запутана. и вот эта строчка:
C++
1
2
double *a2=a;  
a = new double [n];
что здесь происходит и не получится ли что после new два массива будут указывать на одну память?
нет. Не получиться. new записывает в "а" новый указатель, а в "а2" остается указатель на старый. Можете проверить

Добавлено через 4 минуты
проблема скорей всего в том, что я написал в строке 16: замени "9" на "9.0"

Добавлено через 38 минут
Вот что говорит компилятор:
"format '%d' expects argument of type 'int', but argument 2 has type 'double' "
Это по поводу твоей строки "printf ("%d\n",a[i]);"
Читай спецификаторы формата вот здесь: http://www.realcoding.net/article/view/1633
Нужно %f вместо %d

Добавлено через 13 минут
Вот этот код:
#include <iostream>
using namespace std;

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
   int i, n,b;
    n=10;
    double *a = new double [n];
    for (i=0;i<=n;i++){ a[i]=0; printf ("%f\n",a[i]);} //заполняется массив нулями и выводится на экран
    scanf ("%i",&b);
    if (b==1) 
{
   n++; 
   double *a2=a;  //запоминаешь указатель на исходный массив
   a = new double [n]; //создаешь новый   
   i=5;
   a2[i]=9; //записываешь "9" в 5-ю позицию (a2[0] считаем нулевой позицией) исходного массива (кстати попробуй поменять "9" на "9.0"
  // a[i+1]==6; зачем-то сравниваешь 6-ю позицию новосозданного массива, к-рый у тебя ещё не проинициализирован, с "6" (разумеется результат сравнения "false") и более того, результат сравнения ты никак дальше не используешь
  
   for(i=0;i<n-1;i++){ a[i]=a2[i]; printf ("%f\n",a[i]);} //здесь копирование массива и вывод на экран, но в цикле должна быть проверка i<[B]n-1[/B] вместо i<[B]n[/B], так как a2 на единицу короче
   
}
//getch();
    scanf ("%i",&b);
    return 0;
}
При запуске в он-лайн компиляторе: https://compilr.com
Выводит следующее:

Running:
------------------------------
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
1
0.000000
0.000000
0.000000
0.000000
0.000000
9.000000
0.000000
0.000000
0.000000
0.000000

Как видите, 9-ка есть!!!

Добавлено через 40 минут
И ещё, в сообщении "11" правильно замечено: в строке 8 должно быть "i<n", а не "i<=n"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2013, 20:09     Почему массив изначально нулями не инициализируется?
Еще ссылки по теме:

C++ Почему не инициализируется вектор размером 10?
Почему находится произведение между двумя нулями? C++
Почему возможно задать массив с размером -1 (почему такое вообще компилируется)? C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
20.09.2013, 20:09     Почему массив изначально нулями не инициализируется? #15
Цитата Сообщение от _ Посмотреть сообщение
double *a2
a = new double [n];
нет не будут
ибо a2 и a
это два разных имени
Yandex
Объявления
20.09.2013, 20:09     Почему массив изначально нулями не инициализируется?
Ответ Создать тему
Опции темы

Текущее время: 02:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru