Почему memset работает для инициализации 2D-массива в C++ нулем, но не может быть установлен при объявлении следующим образом: `array[n][k+1]={0}`?

Я инициализировал такой массив array[n][k+1]={0}, где n и k вводятся пользователем. Но я обнаружил, что он не инициализирует все значения индекса нулем. Хотя с другой стороны memset(array,0,sizeof(array)) работает нормально. Так почему это произошло?

Потому что каждый раз, когда я инициализировал вот так array[n][n]={0}, он всегда работал нормально. Но почему бы и нет в этом случае.


person Arun Kumar Singh    schedule 25.09.2020    source источник
comment
array[n][k+1]={0} где n и k вводятся пользователем. недействителен С++.   -  person cigien    schedule 25.09.2020
comment
Если n и k не являются константами времени компиляции, array[n][k+1] не является допустимым C++, и любой результат, который вы получаете, является тем, что вы получаете.   -  person NathanOliver    schedule 25.09.2020
comment
n и k вводятся пользователем. VLA не является допустимым C++. это расширение.   -  person Jarod42    schedule 25.09.2020
comment
Относится к VLA: https://stackoverflow.com/questions/1887097/why-arent-variable-length-arrays-part-of-the-c-standard   -  person drescherjm    schedule 25.09.2020
comment
Почему вы не получаете ожидаемую инициализацию, зависит от разработчиков компилятора и от того, как они решают работать с нестандартным расширением. Я подозреваю, что это потому, что это поведение требуется для C99.   -  person user4581301    schedule 25.09.2020
comment
Посмотрел. Я не прав. C99 полностью отвергает инициализацию, поэтому разработчики компилятора C++ просто делают то, что им хочется. Мне действительно нужно обновить мою копию K&R.   -  person user4581301    schedule 25.09.2020
comment
И еще один человек попался на дурацкое золото массивов переменной длины. @OP -- Используйте std::vector<std::vector<int>> myarray(n, std::vector<int>(k+1)); -- Это не только сработает, потому что является стандартным, но и устанавливает массив для всех 0.   -  person PaulMcKenzie    schedule 25.09.2020