2009-07-05 5 views
23

C 또는 C++에서 들쭉날쭉 한 배열이 있습니까?C/C++에서 지그재그 배열이 있습니까?

나는 컴파일하면이 :

int jagged[][] = { {0,1}, {1,2,3} }; 

나는이 오류가 발생합니다 : 당신은 단지 그것을 초기화하려면

error: declaration of `jagged' as multidimensional array must have bounds for all dimensions except the first

답변

14

, 당신은 말할 수 :

int jagged[][3] = { {0,1}, {1,2,3} }; 

하지만 배열을 여전히 형태를 가질 것이다 [2] [3]. 진정한 가변 배열을 원하면 동적으로 배열을 만들어야합니다. 그렇게하고 C++을 사용하는 경우 friol이 제안한대로 std::vector을 사용해야합니다. C++에서

12

은 (컴파일되지, 아마 더 컴팩트 구문있다) : 그래서

std::vector<std::vector<int> > myArray; 

myArray.push_back(std::vector<int>()); 
myArray.push_back(std::vector<int>()); 

myArray[0].push_back(0); 
myArray[0].push_back(1); 

myArray[1].push_back(1); 
myArray[1].push_back(2); 
myArray[1].push_back(3); 

지금 당신이 가진 요소에 액세스 할 수는에서 myArray [0] [0] 등 예를 들어,

+1

포인터를 가지고 있지 않은 벡터에 포인터를 밀어 넣고 있습니다 ... – Goz

21

에서 CI는 포인터의 배열을 사용합니다. 예를 들어

:

int *jagged[5]; 

jagged[0] = malloc(sizeof(int) * 10); 
jagged[1] = malloc(sizeof(int) * 3); 

등 등

+0

이 예제에서 메모리를 비우는 올바른 방법은 무엇입니까? – papgeo

15

그것을 할 수있는 방법의 무리가있다. 여기에 또 다른 방법 :

int jagged_row0[] = {0,1}; 
int jagged_row1[] = {1,2,3}; 
int *jagged[] = { jagged_row0, jagged_row1 }; 
+3

+1. 이것은 C99의 복합 리터럴이 보이는 곳입니다 :'int * jagged [] = {(int []) {0,1}, (int []) {1, 2, 3}}; –

+2

이 솔루션의 문제점은 하위 어레이가 즉시 포인터로 붕괴되어 경계가 무엇인지 알릴 방법이 없다는 것입니다. –

+0

@Neil, 나는 이것을 전혀 생각하지 않았다. 물론 당신 말이 맞습니다. 좋은 점 :) –

2

C99에서 당신이 할 수있는 다음

int jagged_row0[] = {0,1}; 
int jagged_row1[] = {1,2,3}; 

int (*jagged[])[] = { &jagged_row0, &jagged_row1 }; // note the ampersand 

// also since compound literals are lvalues ... 
int (*jagged2[])[] = { &(int[]){0,1}, &(int[]){1,2,3} }; 

여기에 유일한 차이점 (rampion의 대답에 비해이 같은) 배열 포인터와 하나가에 부패가 없다는 것입니다 (예 : *jagged[0] - 각 행의 크기를 기록해야합니다. 즉, sizeof(*jagged[0])은 컴파일되지 않습니다.) 그러나 뼈에 들쭉날쭉하게 나타납니다.)

+0

불완전한 타입의 배열을 만들 수 없다고 생각했습니다 ... 불완전한 타입의 포인터 배열을 만들고 있습니다. 가능하지만, 사탕의 답을 통해 아무것도 사지 않습니다. –

3

오류가 발생하는 이유는 적어도 외부 차원에 대한 경계를 지정하십시오. 즉

int jagged[][3] = {{0,1},{1,2,3}}; 

넌 들쭉날쭉 [0] 및 지그재그 INT [1] INT의 3 소자 어레이 수의 2 소자 어레이가 될 수 없다; N 요소 배열은 M 요소 배열 (N! = M)과 다른 유형이며 배열의 모든 요소는 동일한 유형이어야합니다.

당신이 무엇입니까 do 다른 사람이 위에서 제안한 및 지그재그로 int에 대한 포인터의 배열로 만들 수 있습니다; 각 요소 가리킬 수있는 방법은 여러 크기의 어레이를 정수로 :

row0 및 ROW1 다른 유형 (INT의 2 소자 대 3 소자 어레이) 그들이 이니셜의 맥락에서, 비록
int row0[] = {0,1}; 
int row1[] = {1,2,3}; 
int *jagged[] = {row0, row1}; 

둘 다 내재적으로 동일한 유형 (int *)으로 변환됩니다.C++ 11 초기화 목록과

1

더 컴팩트하게 쓰여질 수 this :

#include <vector> 
#include <iostream> 

int main() { 
    // declare and initialize array 
    std::vector<std::vector<int>> arr = {{1,2,3}, {4,5}}; 
    // print content of array 
    for (auto row : arr) { 
     for (auto col : row) 
      std::cout << col << " "; 
     std::cout << "\n"; 
    } 
} 

출력은 :

: 참고로

$ g++ test.cc -std=c++11 && ./a.out 
1 2 3 
4 5