2017-02-12 3 views
4

현재 구조체에 대한 포인터의 2 차원 배열 cell을 사용하는 함수를 작성하고 있습니다. 각 cell을 파일에서 읽은 데이터로 업데이트해야합니다. 다양한 셀에 액세스해야하므로 동적 할당을 처리해야합니다. 그러나 배열 자체에 액세스 할 필요가 없으므로 여기에서 사용하는 가장 좋은 방법은 무엇입니까? 내가 사용할 수 :포인터의 2 차원 배열

cell *p_cell[height][width] = malloc(height*width*sizeof(cell*)); 

또는 : 다음

cell *p_cell[height][width]; 

와 나중에 (A의 루프, 예를 들어) :

p_cell[i][j] = malloc(sizeof(cell*)); 
이제
+1

'셀 * p_cell [높이] [폭] = malloc에 ​​(높이 * 폭 * sizeof (cell *));'는 유효하지 않으므로 사용할 수 없습니다. 어쩌면 당신은'cell (* p_cell) [height] [width] = malloc (height * width * sizeof (cell *)); 응용 프로그램 목표를 알지 못하면 "최선의 방법"은 광범위한 논의 없이는 식별 할 수 없습니다. – chux

+1

이'cell * p_cell [height] [width];'는 이미'cell', 즉'p_cell'에 대한 포인터의'height'x'width' 크기 배열을 할당합니다. – alk

답변

2

것 같다 :

cell *p_cell[height][width]; 

p_cell[i][j] 이러한 cell * 각 포인터를 할당하기를, 당신은이 작업을 수행 할 수 있습니다

for (size_t i = 0; i < height; i++) { 
    for (size_t j = 0; j < width; j++) { 
     p_cell[i][j] = malloc(sizeof(cell)); 
     /* check malloc */ 
     /* access using p_cell[i][j]->something */ 
    } 
} 
+0

감사합니다! 그게 내가 원하는거야. 나는 Valgrind에서 엄청난 양의 메모리 오류를 겪었으므로 솔루션에 오류가 전혀 없습니다! – narfi

4
data_type (*array) [width] = malloc(sizeof(data_type[height][width])); 

사용자가 데이터에 액세스 할 수 있습니다 사용 예 : arr[i][j]

PS : 2-D a rray는 최상의 읽기 쓰기 성능을 얻기 위해 인접한 메모리 덩어리로 할당되어야합니다.

** 편집 : ** array이 2 차원 배열이 아니라는 의견 섹션의 chux에서 지적한대로 1 차원 배열에 대한 포인터입니다.

array을 2 차원 배열로 만들려면 다음과 같이 선언해야합니다. 당신이로 선언 할 수 포인터의 2 차원 배열, 원하는처럼

data_type (*array) [height][width] = malloc(sizeof(data_type[height][width])); 
+1

'array'는 2 차원 배열이 아니라 1 차원 배열을 가리키는 포인터입니다. – chux

+1

* 항상 * 프로그래밍에 관해서는 너무 강한 단어입니다. 우리가하는 일에는 절대적인 것이 없습니다. 플랫폼마다 다른 제약 조건이 있습니다. – StoryTeller

+0

@chux : 오른쪽, 1 차원 배열에 대한 포인터입니다. 이제 내 대답을 편집했습니다. – Shravan40

2

다음은 2D 배열을 할당하는 두 가지 방법입니다.

cell *(*p_cell)[height][width] = malloc(sizeof(*p_cell)); 

p_cellcell 개체에 대한 포인터의 2D 배열에 대한 포인터입니다. 당신이, 좌표 i에서 j을 항목을 얻을 것

cell *(*p_cell)[][width] = malloc(height * sizeof(*p_cell)); 

:

cell *p = (*p_cell)[i][j]; 

배열의 배열에 p_cell 포인터를 만드는 것이 더 쉬울 것입니다 : 좌표 i에서 항목은 j이 함께 검색된다

cell *p = p_cell[i][j]; 

위의 배열은 초기화되지 않았으므로 기존 cell 개체에 대한 포인터 또는 할당 된 cell 개체에 대한 포인터.2 차원 배열 만 기능 및 특성 widthheight 로컬로 사용되는 경우

는 로컬 스토리지에 2 차원 어레이를 정의 할 수 있으며, 너무 크지 않다 :

cell *p_cell[height][width]; 
width로서

height 동적 값이며, 정적 초기화는 사용할 수 없습니다. 할당 된 루프처럼 중첩 된 루프로이 배열을 초기화해야합니다.

질문 : cell에 대한 포인터로 요소 유형이 정말로 필요합니까?. 이러한 포인터 중 일부가 동일한 개체를 가리 키거나 null 값을 갖거나 다른 곳에서 참조 된 cell 개체를 가리키는 경우에만 유용합니다. 그렇지 않으면 기능에 대한 로컬 또는 malloc() 또는 calloc() 할당하거나, cell 오브젝트의 배열을 사용하는 것이 더 쉬울 것이다 :

cell p_cell[][width] = calloc(sizeof(*p_cell), height);