2013-09-10 3 views
9

Здравствуйте, я пытаюсь использовать функцию std :: copy() для копирования двухмерного массива. Мне было интересно, можно ли так это сделать! Я продолжаю получать «Ошибка сегментации», но массив скопирован правильно. Я попытался вычесть несколько и добавить несколько к концу для функции копирования, но без успеха.std :: copy двухмерный массив

const int rows = 3; 
    const int columns = 3; 
    int myint[rows][columns]={{1,2,3},{4,5,6},{7,8,9}}; 
    int favint[rows][columns]; 
    std::copy(myint, myint+rows*columns,favint); 

Совершенно очевидно, что «Минт + строка * колонки» является неправильной, и оказывается, что это значение соответствует целым строкам, например, что «+ строка MyInt * столбцы = 1» означает, что он будет копировать весь первый ряд , если «myint + rows * columns = 2» копирует первые две строки и т. д. Может ли кто-нибудь объяснить операцию для меня?

+0

Эта часть кода отлично работает на моей машине. Вы уверены, что именно эта часть вашего кода вызывает ошибку сегментации? – texasbruce

ответ

20
std::copy(myint, myint+rows*columns,favint); 

должно быть:

std::copy(&myint[0][0], &myint[0][0]+rows*columns,&favint[0][0]); 

прототип std::copy:

template< class InputIt, class OutputIt > 
OutputIt copy(InputIt first, InputIt last, OutputIt d_first); 

Обратите внимание, что указатель на элемент массива может быть обертка в качестве итератора.

+1

@Mahesh Разница заключается в указании указателя на myint [0] [0], а myint [0] [0] - указатель на myint [0] [0]. Большая разница. – lulyon

+0

@lulyon Они такие же. 2-й массив разрешается в указатель, указывающий на самый первый элемент. – texasbruce

+0

@texasbruce No. 2-й массив разрешен в указатель, указывающий на самый первый ** 1-й массив, который начинается с первого элемента **. – lulyon

Смежные вопросы