2

20x10배열 포인터 배열을 선언하는 동안 메모리 할당되면

단계의 2 차원 배열을 할당하는 동안 메모리가 할당되어 이러한 단계되는 1 int (*p)[10];

단계 2 : p = malloc(20 * sizeof(*p));

모든 메모리 (20 x 10 x 4 바이트)가 2 단계에서 할당 되었습니까? 또는 1 단계에서 어느 정도의 메모리가 할당 되었습니까?

+0

당신은'*'글을 쓰고 있습니까? – elyashiv

+1

[괄호 악몽] (http://stackoverflow.com/questions/859634/c-pointer-to-array-array-of-pointers-disambiguation) – UmNyobe

+0

@elyashiv 예 구문이 올바르다. – user1660982

답변

3

1 단계는 자동 변수로 포인터를 만듭니다. 가리키는 형식은 array-of-10-int입니다.

스텝 2는 20 개의 어레이에 대한 메모리를 할당합니다 (각 어레이의 크기를 보려면 sizeof(*p)을 인쇄하십시오 - 할당 된 블록은 20 배입니다). 그리고 해당 메모리 블록에 대한 포인터를 p에 할당합니다.

따라서 p은 배열 20 개 중 첫 번째 요소 인 -int을 가리 킵니다.

typedef int my_array[10]; 
my_array *p = malloc(20 * sizeof(my_array)); 

그 두 번째 줄은 아마 당신이 malloc으로 사용하는지 다음과 같습니다가 이해하는 데 도움이 경우

는, 코드에 해당합니다. 하지만 여전히 sizeof(my_array)이 아닌 sizeof(*p)을 사용할 수 있습니다.

malloc은 매우 간단합니다. 숫자가 필요하며 많은 바이트가 할당됩니다. 메모리가 어떤 유형인지는 신경 쓰지 않습니다. 따라서 할당 할 메모리의 양이 의심스러운 경우에는 해당 번호를 인쇄하거나 디버거에서 직접 확인할 수 있습니다.

4

첫 번째 단계는 포인터 일 뿐이며 단일 포인터를 넘어서 아무것도 할당하지 않습니다. 포인터의 배열이 아니라 배열에 대한 포인터라는 것을 기억하십시오.

배열 내에서 사용 된 모든 저장소는 malloc() 호출에 의해 할당됩니다.