2013-09-21 4 views
0

파일의 레코드를 동적 배열로로드하려고합니다. 나는 다음 코드를 가지고있다 :realloc 후 struct 크기가 잘못되었습니다.

typedef struct my_data { 
    char name[100]; 
}my_data; 
struct my_data *data; 

void load_data() 
{ 
struct my_data *temp = NULL; 
    int i = 0; 
    FILE * in; 
    if((in = fopen("data.txt","rt")) != NULL) { 
    temp = malloc((i+1)*sizeof(my_data)); 
    while(!feof(in)) 
     { 
      fscanf(in,"%s", &temp[i].name); 
      i++; 
      temp = realloc(temp,((i+1)*sizeof(my_data))); 
     }; 
     fclose(in); 
    data = temp; 
    free(temp); 

    for (i=0;i<sizeof(data);i++) 
     printf("%s\n",data[i].name); 
    } 

나는 100 개가 넘는다. 왜 4 개 밖에 보이지 않는 거지?

답변

3
sizeof(data) 

는 위 유형 my_data *, 시스템에 4 바이트이다 data의 크기를 제공합니다. 레코드 수를 얻으려면 메모리 할당 방법 (즉, i+1 레코드)과 동일한 논리를 따르십시오. for 루프 초기화 표현에서 i을 으로 재 할당했음을 유의하십시오.

+0

나는 당신 말이 맞습니다. 그러나 int i global을 만드는 것 이외에 레코드 수를 내보내는 다른 방법이 있습니까? –

+1

@SamReina 포인터와 함께 크기를 항상 전달할 수 있습니다. 또는 구조체에 포인터와 크기를 넣을 수 있습니다. –

+0

고마워요,하지만 그 루프는 테스트 목적으로 만 사용됩니다. 그래서 구조체에 int의 전체 값 (루프 외부) 또는 각 값 (루프 내부)을 추가해야하며 마지막 사례의 경우 총계를 어떻게 계산해야합니까? 각 배열 [i]에 대해 int의 해당 값이 i 인 경우 총계를 계산할 수있는 방법이 없다는 것을 의미합니다. 또는 나는 총체가 될 마지막 요소에서 int i를 얻을 것인가? 너무 많은 질문에 대해 미안하지만 나는 아직도 배우려고 노력하고있다. –

0

데이터는 struct my_data에 대한 포인터 일 뿐이므로 sizeof(struct my_data *)sizeof(void *)과 같으며 포인터 크기를 반환합니다 (시스템에 따라 4 또는 8 또는 다른 것입니다).

sizeof을 사용하여 C 배열의 길이를 가져올 수 없습니다. 길이를 직접 변수에 저장해야합니다.

0

실제로 struct에는 char에 대한 포인터 만 있기 때문에 sizeof (my_data)는 4와 같습니다. 100 자의 문자열이 아닙니다.

관련 문제