2014-08-13 3 views
0

Я использовал memcpy какое-то время с одномерными массивами, но когда я пытаюсь выполнить двумерные странные вещи. Следующая программа иллюстрирует проблему:memcpy и двумерные массивы

using namespace std; 
#include <iostream> 
#include <string.h> 
#include <complex> 

int main() { 

    int n=4; 
    complex<double> **mat1=new complex<double>*[n], **mat2=new complex<double>*[n]; 
    for(int i=0;i<n;i++) {mat1[i]=new complex<double>[n]; mat2[i]=new complex<double>[n];} 

    for(int i=0;i<n;i++) { 
     for(int j=0;j<n;j++) mat1[i][j]=complex<double>(i*j, i+j); 
    } 

    cout << endl << "Matrix 1:" << endl; 
    for(int i=0;i<n;i++) { 
     for(int j=0;j<n;j++) cout << mat1[i][j] << " "; 
     cout << endl; 
    } 

    cout << endl << "memcpy" << endl << endl; 
    memcpy(mat2, mat1, n*n*sizeof(complex<double>)); 

    cout << "Matrix 1:" << endl; 
    for(int i=0;i<n;i++) { 
     for(int j=0;j<n;j++) cout << mat1[i][j] << " "; 
     cout << endl; 
    } 

    cout << endl << "Matrix 2:" << endl; 
    for(int i=0;i<n;i++) { 
     for(int j=0;j<n;j++) cout << mat2[i][j] << " "; 
     cout << endl; 
    } 
} 

первую распечатку mat1 хорошо, но во втором и что из mat2 работает первая половина элементов являются бредом. Любая идея, что происходит?

+2

Не используйте memcpy в C++, поскольку он не играет хороших с классами. Используйте 'vector >> mat1 (Y, vector > (X));' для вашего 2d массива. Чтобы скопировать 'mat2 = mat1;' –

+2

В C++ вы действительно не должны использовать массивы memcpy или C-style. –

+4

Массив * указателей на * одномерные массивы не является двумерным массивом. –

ответ

2

Вы не используете двумерные массивы. Вы используете 1-мерные массивы и еще один, который хранит набор указателей. Если вы не гарантируете, что ваши массивы будут постоянно находиться в памяти.

Каждый раз, когда вы запрашиваете в коде для нового размещения, ваша программа найдет (новую) область памяти для размещения в (новом) массиве. Если вы напечатаете массив, в котором хранятся указатели, вы можете прочитать, где находятся ваши массивы.

1

Как указано выше, вы не должны использовать memcpy здесь.

Но для записи, когда вы делаете memcpy таким образом, стираете указатели в mat2, создаете утечку и копируете что-то слишком большое в mat2, f *** загружая свою память. Правильный способ memcpy будет состоять в том, чтобы memcpy независимо каждый элемент mat1 в mat2.

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