2016-11-18 1 views
1

저는 malloc과 메모리 할당에 대해 충분히 생각하고 있습니다. 나는 최근에 내가 이마를 키우는 상황을 보았습니다.Malloc은 내부 배열을 만들 필요가 없습니다.

배열로 들여다 보면서 배열 배열을 만들었습니다. 어느 쪽이 내 마음 속에 이런 식으로 보일까요? [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], ...] 외부 배열을 만들기 위해 malloc이 필요했기 때문에 이것을했을 때 생각했습니다. 나는 또한 내가 만드는 각각의 내부 배열에 대해 malloc을 호출해야했다. 나는 나에게 의미가없는이 단계를 건너 뛸 때 같은 출력을 얻는다는 것을 빨리 알았다.

다음 스크립트를 고려하십시오. 다음과 같이

int main(int argv, char* argc[]){ 

    // initialize outer array 
    int* outer = malloc(5 * sizeof(int)); 

    int i, j; 

    // for each slot in outer array 
    // create a new array and assign it 
    // to that slot. 
    // NOT NEEDED. 
    for(i = 0; i < 5; i++){ 
     int* inner = malloc(5 * sizeof(int)); 
     *(outer + i) = *inner; 
    } 
    // If I comment out the above four lines 
    // the output remains the same. 

    // assign to each slot in each inner array 
    for(i = 0; i < 5; i++) 
     for(j = 0; j < 5; j++) 
      *(outer + i * 5 + j) = j; 

    // print each element in each inner array 
    for(i = 0; i < 5; i++){ 
     for(j = 0; j < 5; j++){ 
      printf(
       "%d ", 
       *(outer + i * 5 + j) 
      ); 
     } 
     puts(""); 
    } 
} 

이 스크립트의 출력은 다음과 같습니다

0 1 2 3 4 
0 1 2 3 4 
0 1 2 3 4 
0 1 2 3 4 
0 1 2 3 4 

내가 기대했던 것입니다. 그러나 스크립트에서 첫 번째 for 루프를 주석 처리 할 때 동일한 출력을 얻습니다. 왜 이런거야? 내부 배열에 메모리를 할당 할 필요가 없습니까? 분명히 대답은 '아니오'지만 나는 왜 그런지 이해하려고 노력하고 있습니다.

+0

뒤에있는 아이디어는 정확히 무엇입니까? '... = * inner;'? – alk

+0

외부 배열의 해당 색인에 대해 @alk, 새로운 메모리 공간을 할당하십시오. – marcusshep

+2

은 C++의 질문에도 도움이 될 수 있습니다. http://stackoverflow.com/questions/4316736/using-unallocated-memory-without-error – Cherubim

답변

2

짧은 대답 : Undefined behavior.

내부 배열에 대한 메모리 할당에 실패하면 포인터는 초기화되지 않으므로 지정되지 않은 메모리 위치를 가리 킵니다.

정의되지 않은 동작으로 인해 프로그램이 충돌하거나 예상치 못한 방식으로 동작하거나 제대로 작동하는 것처럼 보일 수 있습니다. 사용되지 않는 변수를 추가하는 것과 같이 관련이없는 것으로 보이는 변경 사항은 프로그램 동작을 변경시킬 수 있습니다.

+0

그래서 각 내부 배열에 대한 메모리를 할당해야한다는 나의 첫 번째 직관은 옳았습니까? – marcusshep

+0

@marcusshep 올바른지, 당신은 내부 배열에 대한 메모리를 할당해야합니다. – dbush

관련 문제