Можно ли мемсетить двухмерные массивы?

программирование C++ си

Например, так:
int **A = new int*[N];
for (int i = 0; i < N; i++)
A = new int[M];
memset(A, 0, sizeof(int) * M * N);
Ответы:
Нет, нельзя, см. описание memset, оно работает с одним буфером по указателю.
Еще раз, в С и С++ нет встроенной поддержки массивов, проще говоря массивов в С/C++ нету. Причина по которой memset не прокатит, это то что сперва выделяет блок размером sizeof(int *) * N, затем N блоков размером M * sizeof(int) и эти блоки находятся в разных местах адресного пространства процесса. А memset занулит по байтно последовательно начиная с указаного адреса, а это в лучшем случае приведет к SIGSEGV, в худшем затерет значения не там где надо.
Не хорошо так кучу фрагментировать. Какой смысл был выделять память под отдельные строки? Выделяйте под всю матрицу целиком. Все равно матрица - это иллюзия, фактически существует только одномерная развертка. И мемсетьте как Вам заблагорассудится.


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.