2016-09-30 2 views
0
struct student{ 
    int id; 
    int score; 
}; 

struct student* allocate(){ 
    struct student* students = (struct student*)malloc(sizeof(struct student)*10); 
    return students; 
} 


void generate(struct student* students){ 
    int i=0; 
    printf("%lu\n", sizeof(students)); 
    printf("%lu\n", sizeof(struct student)); 
    int length = sizeof(students)/sizeof(struct student); 
    printf("%d\n", length); 
    for(i=0;i<length;i++){ 
      printf("hi\n"); 
    } 
} 

10 개의 학생 구조체 배열을 생성해야하는이 코드가 있습니다. }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} 함수를 생성하고 학생 배열에 할당 된 메모리의 양을 확인하려고하면 단일 학생 구조체와 동일한 8 바이트 만 쓰고 for 루프에 도달하면 한 번만 'hi'를 인쇄한다. 그것은 8 번해야합니다. 나는 무엇을 잘못 했는가?C가 구조체 배열에 메모리를 올바르게 할당하지 못 했습니까?

출력 :

8 
8 
1 
hi 
+1

"... 학생 배열이 할당 한 메모리 양을 확인하는 중 ...". 그 이유는'sizeof' 연산자가 그 목적에 적합한 것이라고 믿게 만들었던 이유가 무엇입니까? 'sizeof' 사용법에 대해 어떻게 생각해 냈습니까? – AnT

+1

sizeof (students)는 배열의 크기가 아니라 포인터의 크기를 제공합니다. –

+0

배열의 크기를 얻는 가장 좋은 방법은 무엇입니까? – izzzi

답변

3

내가 잘못 무슨 짓을?

students은 포인터이므로 sizeof(students)은 포인터 크기를 제공합니다. students이 가리키는 배열의 크기는 알려주지 않습니다.

sizeof(*students)도 만족스럽지 않습니다. 학생의 크기가 아니라 전체 배열의 크기를 제공합니다. 왜냐하면 컴파일러에 관한 한 students은 첫 번째 학생을 가리키기 때문입니다.

배열의 시작 부분에 대한 포인터가있는 경우 배열의 크기를 가져 오는 기본 제공 방법이 없습니다. 당신은 당신 자신의 크기를 추적해야합니다.

관련 문제