2013-03-27 3 views
1

최근 구조체에 동적으로 메모리를 할당해야하는 과제가있었습니다. 나는이 방법을 사용했다 :C에서 동적으로 구조체를 할당하는 방법은 무엇입니까?

myStruct *struct1 = malloc(sizeof *struct1); 

이것은 잘 동작했다. 그러나 나는 어떻게 이해하지 못한다. 그 시점에서 struct1 포인터가 초기화되지 않았으므로 크기가 작아야한다고 생각합니다. 따라서 malloc(sizeof *struct1)은 어떻게 할당할만한 양의 메모리를 반환합니까?

+1

sizeof는 런타임이 아닌 컴파일시에 해결됩니다. –

+2

@PeteBaughman : 가변 길이 배열의 경우는 예외입니다. – dreamlax

답변

5

sizeof 연산자는 피연산자를 계산하지 않습니다. 그냥 유형을 봅니다. 예를 들어 위의 프로그램을 실행하면

#include <stdio.h> 

int main(void) 
{ 
    int i = 0; 
    printf("%zu\n", sizeof i++); 
    printf("%d\n", i); 
    return 0; 
} 

, 당신은 i 여전히 0

따라서, 귀하의 예제에서, *struct1이 평가되지 않습니다, 그것은 단지 형 정보 사용되는 것을 볼 수 있습니다.

+0

그래서 기본적으로 구조체의 모든 데이터 유형을보고 이에 따라 메모리를 할당합니까? – Slayter

+0

나는 그 일을 결코 시도한 적이 없지만, 우연의 일치에 의해서만. Thx, 근사하고 간결한 대답. – technosaurus

+0

주의 사항 ... 유효한 프로그램이 아니라면 C 프로그램을 통해 모든 것을 입증 할 수있는 것은 아닙니다. 많은 사람들이 실수로 증명을 위해 정의되지 않은 구현 특정 동작을 나타냅니다. –

0
malloc(sizeof(*struct1)) 

은 선언 한 구조 변수의 수에 따라 구조체 크기와 동일한 크기의 메모리를 할당합니다. Sizeof는 컴파일 타임에 발견 된 struct1의 크기를 반환하는 데 사용됩니다.

0

그냥 사용해보세요. ,

MyStruct test; 

printf("~~~~~ sizeofStruct: %ld", sizeof(test)); 

MyStruct *myAlloc = (MyStruct *)malloc(sizeof(test)); 

printf("~~~~~ sizeofmyAlloc: %ld", sizeof(*myAlloc)); 

건배, 다음 메모리를 할당하기 전에, 제

typedef struct { 

int a; 
int b; 
int c; 

}MyStruct; 

구조를 선언 한 구조의 변수를 초기화하고 주어진 메모리를 할당!

관련 문제