20x10배열 포인터 배열을 선언하는 동안 메모리 할당되면
단계의 2 차원 배열을 할당하는 동안 메모리가 할당되어 이러한 단계되는 1 int (*p)[10];
단계 2 : p = malloc(20 * sizeof(*p));
모든 메모리 (20 x 10 x 4 바이트)가 2 단계에서 할당 되었습니까? 또는 1 단계에서 어느 정도의 메모리가 할당 되었습니까?
20x10배열 포인터 배열을 선언하는 동안 메모리 할당되면
단계의 2 차원 배열을 할당하는 동안 메모리가 할당되어 이러한 단계되는 1 int (*p)[10];
단계 2 : p = malloc(20 * sizeof(*p));
모든 메모리 (20 x 10 x 4 바이트)가 2 단계에서 할당 되었습니까? 또는 1 단계에서 어느 정도의 메모리가 할당 되었습니까?
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
은 매우 간단합니다. 숫자가 필요하며 많은 바이트가 할당됩니다. 메모리가 어떤 유형인지는 신경 쓰지 않습니다. 따라서 할당 할 메모리의 양이 의심스러운 경우에는 해당 번호를 인쇄하거나 디버거에서 직접 확인할 수 있습니다.
첫 번째 단계는 포인터 일 뿐이며 단일 포인터를 넘어서 아무것도 할당하지 않습니다. 포인터의 배열이 아니라 배열에 대한 포인터라는 것을 기억하십시오.
배열 내에서 사용 된 모든 저장소는 malloc()
호출에 의해 할당됩니다.
당신은'*'글을 쓰고 있습니까? – elyashiv
[괄호 악몽] (http://stackoverflow.com/questions/859634/c-pointer-to-array-array-of-pointers-disambiguation) – UmNyobe
@elyashiv 예 구문이 올바르다. – user1660982