2

이 작업을 실행할 때 세그멘테이션 오류가 발생하지만 오류는 발생하지 않습니다. 포인터 배열에 포인터를 전달하려고합니다. 포인터 배열로 초기화하고 배열 및 호출 함수에서 사용할 수있는 데이터를 채 웁니다.빈 배열을 참조로 전달하고 함수 내에서 초기화하십시오.

static void test4(int ***arr) 
{ 
    int *values = (int *) MEM_mallocN(sizeof(int) * 3, "*values"); 
    values[0] = 0; 
    values[1] = 1; 
    values[2] = 2; 
    *arr = (int **) MEM_mallocN(sizeof(int *) * 3, "*arr"); 
    *arr[0] = &values[0]; 
    *arr[1] = &values[1]; 
    *arr[2] = &values[2]; /* this line causes crash */ 
} 

static void test3(void) 
{ 
    int **arr = NULL; 
    test4(&arr); 
    for (int i = 0; i < 3; i++) { 
     printf("arr[%d] = %p \n", i, arr[i]); 
    } 
    for (int i = 0; i < 3; i++) { 
     printf("arr[%d] = %d \n", i, *arr[i]); 
    } 
} 
+4

'* arr [0]'은'(* arr) [0]'이 아니라'* (arr [0])'입니다. – Ryan

+2

여기 포인터를 포인터로 사용해야하는 분명한 이유는 없습니다. 이 엉망인 3 스타 프로그래밍 대신 [다차원 배열을 올바르게 할당] (https://stackoverflow.com/questions/42094465/correctly-allocating-multi-dimensional-arrays)을 원할 수 있습니다. – Lundin

+0

C에는 참조가 없습니다. 당신은 포인터를 사용합니다. 그리고 3 별 프로그래머가되는 것은 칭찬이 아닙니다. – Olaf

답변

2

당신이

(*arr)[0] = &values[0]; 
(*arr)[1] = &values[1]; 
(*arr)[2] = &values[2]; 

후위 첨자 연산자 [] 단항 연산자보다 우선 순위 *를 가지고 의미하는 것 같다.

관련 문제