2013-08-28 3 views
0

이전에 동적으로 할당 된 2 차원 배열에 행을 추가하려고했지만 컴파일러에서 새 메모리를 할당하려고하는 행에서 lvalue가 필요하다는 오류가 발생합니다. 새로운 행.cpp를 사용하여 동적 행을 추가 한 후

#include<iostream> 
//#include<stdlib.h> 
using namespace std; 

int main() 
{ 
    int (*p)[2] = new (int [5][2]); 
    for(int i =0; i<5; i++) 
    { 
     for(int j =0; j<2; j++) 
     { 
      p[i][j]= i; 
     } 
    } 

// p = (int **) realloc(void*, 12) 
    int **l = (int **)p; 
    (l+5) = new int[1][2]; 
    p[5][0] = 5; 
    p[5][1] = 5; 

    for(int i =0; i<=5; i++) 
    { 
     for(int j =0; j<2; j++) 
     { 
      cout<<p[i][j]; 
     } 
    } 

} 
+2

'int ** l = (int **) p;'입니다. 그게 ... awfuly wrong. 2 차원 배열에 대한 포인터는 포인터에 대한 포인터가 아닙니다. 캐스트없이 시도했을 때의 오류에 대한 좋은 이유가 있습니다. – jrok

+1

['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector)를 참조하십시오. –

+0

'std :: vector'를 지적하는 것은 완벽하게 올바른 일입니다. 이것은 오히려 배열을 가르치는 데 사용되는 간단한 학교 과제에서 취한 것으로 보인다. – LihO

답변

0

C++ 코드에서 C 스타일 배열을 사용하면 엄청난 코드가 생성됩니다. 읽고 이해하기 어렵고 최악은 유지하기가 어렵습니다. 여기서 적절한 해결책은 std::vector을 대신 사용하는 것 같습니다.

그러나 std::vector (일종의 학교 과제 임)을 사용하지 않을 이유가있는 경우 원래 배열을 새로 생성 된 것으로 교체해야합니다. 그래서 당신은 유형 int (*)[2]의 포인터가 있습니다

// create an array and initialize it: 
int (*p)[2] = new (int [5][2]); 
for(int i = 0; i < 5; i++) 
    for(int j = 0; j < 2; j++) 
     p[i][j]= (i+1) * (j+1); 

지금 당신이 (당신이 메모리의 연속 블록 작업을하고 있다는 사실을 원래의 포인터를 동일한 유형의 포인터로 표시되는 새로운 배열을 생성하고 할당 할 수 있습니다

int (*p2)[2] = new (int [6][2]); 
memcpy(&p2[0][0], &p[0][0], sizeof(int) * 5 * 2); 
delete[] p;           // don't forget to clean up 
p = p2; 

을하지만 지금은 그렇게 정의되지 않은 동작이 발생할 수있는 몇 가지 초기화되지 않은 메모리있다 :) 요소를 복사하려면 여기를 사용할 수

// initialize new row: 
for(int j = 0; j < 2; j++) 
    p[5][j]= 6*(j+1); 

지금을 당신은 값을 인쇄하고 (포인터 p2를 사용하여뿐만 아니라 포인터 p 여전히 사용하여 수행 할 수있는)과 새로 만든 배열을 파괴 할 수 있습니다

for(int i = 0; i < 6; i++) 
    for(int j = 0; j < 2; j++) 
     std::cout << p[i][j] << ' '; 

delete[] p; 

1 2 2 4 3 6 4 8 5 10 6 12 :


를 인쇄

추신 : memcpy이 정의되지 않은 경우 문제가 발생하면 #include <cstring>