2014-09-18 6 views
0

"Free (array)"세 번째 줄은 누구에게 알 수 있습니까? 여기 배열은 배열의 첫 번째 요소의 주소입니다 (즉, int * right 배열의 첫 번째 요소에 대한 포인터)? 2D 배열의 "열"을 해제하기 위해 세 번째 선이 필요한 이유는 무엇입니까? 나는 기본적으로 암기했다 /는 a가 ____의 주소를 가지고 있다는 것을 가리키는 포인터임을 이해한다. 이 구절이 맞습니까?동적으로 할당 된 2 차원 배열

예 : int ** a; int * b; int c; b = & c = 4; a = & b; 이게 맞습니까? 고맙습니다!!!

또한 일반적으로 이중 포인터는 기본적으로 동적으로 할당 된 배열입니까?

"마지막으로, 동적으로 할당 된 다차원 어레이 중 하나를 해제해야 할 때 우리가 할당 한 각각의 메모리 덩어리를 해제해야한다는 것을 기억해야합니다. (최상위 포인터를 해제하면됩니다. "http://www.eskimo.com/~scs/cclass/int/sx9b.html

for(i = 0; i < nrows; i++) 
    free(array[i]); 
free(array); 
+0

또한 array가 char * 인 printf ("% s", array)를 사용할 때 컴파일러는 배열을 array [0]의 주소로보고 있지만 올바르게 인쇄합니까? 나는 그것을 올바르게 이해하고 있는지 궁금 할뿐입니다. –

답변

2
: 우리가했던 경우 모든 두 번째 수준 포인터가 해제 손실이 아닌 것, 그리고 메모리를 낭비 것) 다음 코드처럼 보일 수 있습니다 무엇을, 배열은, 그것을 잘라하지 않을 것입니다.

왜 2D 배열의 "열"을 비우기 위해 세 번째 줄이 필요합니까?

할당 수는 할당 수와 일치해야합니다.

당신이 문서의 시작 부분에 코드를 보면 :

int **array; 
array = malloc(nrows * sizeof(int *)); 
for(i = 0; i < nrows; i++) { 
    array[i] = malloc(ncolumns * sizeof(int)); 
} 

각 행에 대해 하나의 배열 자체에 대한 malloc() 하나 malloc()이 있음을 볼 수 있습니다.

자유롭게 사용할 수있는 코드는 기본적으로 반대입니다.

또한 일반적으로 이중 포인터는 기본적으로 동적으로 할당 된 배열입니까? 반드시

하지 않습니다. 동적으로 할당 된 배열은 이중 포인터에 대한 하나의 사용이지만, 유일한 용도는 아닙니다.

0

malloc을 호출하면 해당 인수에 지정된 바이트 수와 동일한 힙에 메모리를 할당하고이 메모리 블록의 주소를 반환합니다. 귀하의 '2D 배열'은 실제로는 1D 배열의 int 주소이며, 각각은 malloc에 ​​의해 할당 된 메모리 덩어리를 가리 킵니다. 완료되면 이러한 각 청크를 해제하여 다른 사람들이 사용할 수 있도록해야합니다. 하지만 1D 배열은 malloc의 주소를 담을 수있는 또 다른 malloc 된 메모리 덩어리이며, 또한 해제해야합니다.

또한 array가 char * 인 printf ("% s", array)를 사용할 때 컴파일러는 배열을 array [0]의 주소로보고 있지만 올바르게 인쇄합니까? 나는 그것을 올바르게 이해하고 있는지 궁금 할뿐입니다.

예, % s는 printf가 지정한 주소 (char, aka char *, let 's say의 주소)로 이동하여 해당 주소의 메모리에있는 문자 하나를 읽고 표시하기 시작합니다. 'NULL 문자'를 찾을 때까지의 시간. 그래서 문자열의 경우 문자열은 char의 배열이고 '\ 0'char이 뒤 따르기 때문에 예상되는 동작입니다.