2017-11-24 1 views
-1

C에서 배열 메서드에 쓰기를 시도했지만 예상 한 결과를 반환하지 않는 것 같습니다.C - 포인터 및 배열

How many numbers would you like to short?: 3 
Checking for the i: 0: 1 
Setting the number to temp 1 
Checking for the i: 1: 2 
Setting the number to temp 2 
Checking for the i: 2: 3 
Setting the number to temp 3 
Setting the array2 to *array 
0: 6487440 
1: 0 
2: 6480512 

---------------------------------- 
Proces exited after 1.741 seconds with return value 3 

그리고 이것은 코드

int array_size; 

void getArray(int *array[]); 
void printArray(int array[]); 

void main() { 
    printf("How many numbers would you like to short?: "); 
    scanf("%d", &array_size); 

    int input[array_size]; 

    getArray(&input); 

    printArray(input); 
} 

void getArray(int *array[]) { 
    int i, temp; 
    int array2[array_size]; 
    for(i = 0; i < array_size; i++) { 
     printf("Checking for the i: "); 
     printf("%d: ", i); 
     scanf("%d", &temp); 
     printf("Setting the number to temp %d\n", temp); 
     array2[i] = temp; 
    } 

    printf("Setting the array2 to *array\n"); 
    *array = array2; 
} 

void printArray(int array[]) { 

    int i; 
    for(i = 0; i < array_size; i++) { 
     printf("%d: %d\n", i, array[i]); 
    } 



} 

I scanf와 같은 시도하여 ("%의 D를"& 배열 * [I])이다에게 하지만 작동하지 않습니다.

내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까? 미리 감사드립니다.

+0

'* array = array2;'를 쓰면 무엇을 할 계획입니까? –

+0

이것을 컴파일하려고하면 경고가 표시되지 않습니까? 경고를 기본 수준으로 낮추더라도 gcc에 8 가지 경고가 표시됩니다. 먼저 수정하십시오. –

+0

항상 텍스트를 표시하고 사진을 표시하지 않습니다. (당신을 위해 그것을 고쳤습니다.) – DevSolar

답변

1

여기에서 많은 것들이 잘못되었습니다. 배열을 건네주는 것보다 먼저 전달하는 배열은 단순히 getArray(&input); --> getArray(input);이 될 것입니다.

함수로 전달 될 때 1D 배열은 포인터로 쇠퇴합니다. 호출 된 함수에서 포인터를 통해 배열에 대한 모든 변경 사항을 유지할 수 있습니다.

void getArray(int *array) { 
    int i, temp; 
    for(i = 0; i < array_size; i++) { 
     printf("Checking for the i: "); 
     printf("%d: ", i); 
     scanf("%d", &array[i]); 
    } 
} 

이렇게하면 원하는 작업을 수행 할 수 있습니다. 그러나 이전에 함수가 }에 도달하면 자동 변수가 할당 해제되기 때문에 할당이 잘못되었습니다. 따라서 함수 범위 밖에서 액세스하면 정의되지 않은 동작이 발생합니다.


좀 더 정교한 아이디어를 제공하기 위해 대부분 오류 메시지가 논의됩니다.

코드를 컴파일하면 오류가 발생합니다. 이제 오류 메시지를 살펴보십시오. error: cannot convert 'int (*)[array_size]' to 'int**' for argument '1' to 'void getArray(int**)'.

&inputint(*)[array_size]입니다. 이는 array_size 정수 배열에 대한 포인터임을 의미합니다.

오류 메시지를 보면 알 수 있겠지만 여기 int**의 주소는 getArray()입니까?

음, int* array[] (이 함수는 이것을 매개 변수로 받겠다 고 선언했습니다)은 arrayint* -s의 배열임을 나타냅니다. 이제 첫 번째 요소에 대한 포인터로 붕괴됩니다.

여기 잠깐 뭐라 구요? 그것은 포인터입니다.

포인터에 대한 포인터는 무엇입니까? 예, int**입니다.

단순히 오류가 발생하여 변환 할 수 없다는 불만이 있습니다.

0

어디에서 데칼을 보았습니까 array2. getArray()의 범위를 끝내 자마자 그 메모리는 으로 할당 해제됩니다. 따라서 나중에 액세스하려고하면 그 순간 메모리에있는 내용으로 끝납니다.