2013-05-06 5 views
1

코드의이 부분을 고려 예상 함수에 "포인터 포인터"를 전달하는 방법? foo()의 프로토 타입은 다음과 같이 선언 된 : 당신은 그 foo 함수에 매개 변수로 ptr을 통과 할 수방법 "배열에 대한 포인터가"

void foo(int arr[][MAX]); 
+0

'foo' 매개 변수가 다른 것으로 보입니다. – BLUEPIXY

+0

http://stackoverflow.com/a/14549030/399317 – Kos

+0

@BLUEPIXY'foo 매개 변수가 필요합니다 .'' 그게 무슨 뜻인지 BLUEPIXY? –

답변

6

.

2 차원 배열 (배열 배열)의 메모리 레이아웃은 배열에 대한 포인터 배열의 메모리 레이아웃과 매우 다릅니다.

int** (및 크기 정보 일 수도 있음)을 허용하도록 함수 서명을 변경하거나 ptr을 적절한 크기의 2 차원 배열로 정의하십시오.

3

예제에서 foo 함수는 실제로 MAX 열과 불특정 다수의 행을 사용하여 int의 2-D 배열을 원한다고 가정합니다. 이것은 C와 C++에서 메모리에서 행이 어떻게 배치되어 있는지에 따라 작동합니다. 열 N + 1에서의 모든 요소는 행 (N)의 모든 요소 후에 연속적 표시

int arr[][MAX]는 2-D 어레이의 행으로의 포인터가 아니라 어레이의 첫 번째 요소에 대한 포인터를 요청 구. 당신이 2-D 배열을 원한다고 가정하고, 이 아니라 포인터의 배열을 가정합니다.

먼저 요소를 올바르게 할당해야합니다. arr[][MAX]의 가장 왼쪽 치수가 무엇인지 또는 그 출처를 지정하지 않았습니다. 당신의 함수를 호출, 그리고

int (*ptr)[MAX]; /* pointer first element of an int[][MAX] array */ 

/* Allocate a 2-D array of dim * MAX ints */ 
ptr = (int (*)[MAX]) malloc(dim * MAX * sizeof(int)); 

그냥 foo(ptr)을하고는 오류 또는 경고없이 작동 것이다 : 나는 여기에 변수 dim에있어 가정합니다.

(특히 2 차원 배열을 많이 사용하는 경우) 코드 유형을 정리하려면 typedef에 포인터 유형을 래핑하고 이러한 배열을 할당하는 작은 함수를 작성하는 것이 좋습니다.

int_array_2d ptr = alloc_int_array_2d(dim); 

사용 당신의 이점에 대한 형식 시스템 :

typedef int (*int_array_2d)[MAX]; 

int_array_2d alloc_int_array_2d(int dim1) 
{ 
    return (int_array_2d) malloc(dim1 * MAX * sizeof(int)); 
} 

그런 식으로, 다른 코드에서, 당신은 훨씬 더 간단 뭔가 청소기를 말할 수있다. 유형 및 타입 변환에 대한 C 및 C++ 구문은 추악하고 대부분의 사람들에게는 익숙하지 않습니다. 그들은 *[]의 우선 순위 때문에 이상하게 보입니다. 그러나 typedef에 숨기면 배열과 포인터를 혼합 할 때 발생하는 C/C++의 이상한 우선 순위 문제를 이해하는 대신, 수행하려고하는 것에 집중할 수 있습니다.

관련 문제