Как инициализировать нулевой массив в c

#c #arrays #initialization

#c #массивы #инициализация

Вопрос:

 int M=7;
int N=6;
int i=0;
int x=N*M;
int val3[x] = {};
for(int i=0;i<x;i  )
{
      //some calculations
      if (my condition)
      {
            //if this condition ok, change value of val[i]
      }
      cout << i << "   " << val[i] << endl;
}
  

Я хочу инициализировать ноль array(val) , я использовал приведенные выше коды, но я получил сообщение об ошибке, в котором говорится, что объект переменного размера, возможно, не инициализирован. невозможно ли инициализировать нулевой массив? нужна ваша помощь …. спасибо

Комментарии:

1. Следует отметить: у вас есть 2 переменные с именами i . Один в списке переменных в верхней части фрагмента и один в цикле for. Не уверен, компилируется ли он (вероятно, компилируется), но i в цикле маскирует другой. Вы должны исправить это.

Ответ №1:

C не включает массивы переменной длины; int val3[ x ] с x непостоянством — это особенность C99. Не все функции C99 являются частью C . Попробуйте использовать std::vector .

 #include <vector>

// contains an array of length x, automatically filled with zeroes
std::vector< int > val3( x );
  

Ответ №2:

 int val3[x] = {};
  

C не позволяет инициализировать массивы переменной, которая не является константой времени компиляции. Используйте a const int для всех переменных (кроме i ).
Кстати, вы не используете это первым int i (вне цикла).

Ответ №3:

В качестве альтернативы std::vector, предложенному выше, вы также могли бы сделать:

 int M=7;
int N=6;
int x=N*M;

int* val3 = new int[x];
memset(val3, 0, x * sizeof (int));
for (int i = 0; i < x; i  )
{
    // ...
}
// ...
delete [] val3;
  

Комментарии:

1. я использовал эти коды, но мои результаты показывают очень большие значения, я надеюсь, это из-за указателя (val3). как получить значение этого указателя?

2. Я полагаю, вы имеете в виду «как получить значения, на которые указывает этот указатель»? Если это так, то val3 [n] для n в [0, x-1] . например, для x = 3 у вас будет val3 [0], val3[1], val3 [2].

3. Итак, в вашем цикле, если вы просто используете cout << val3[i] << endl; , это должно вывести нули, если вы ничего больше не сделали между memset и cout;

4. нет, нет, внутри моего цикла я использовал свои вычисления, а затем проверил вывод в соответствии с заданным условием, затем, если мое условие выполнено, я хочу изменить 0 на результат. я уже выполнил свою часть вычисления. теперь я не хочу видеть свой вывод. итак, я использовал другой цикл for от 0 до конца этого массива, и использовал cout … но он показывает неправильные значения (memeory), так как же получить значение val3?

5. В моем memset была ошибка. memset присваивает некоторым байтам некоторое значение. Поскольку мы указываем на целые числа, нам нужно умножить x на количество байтов в int (т.Е. sizeof(int)). Теперь это должно сработать для вас.