2013-03-08 2 views
0

간단한 단어로 말하면 구조체하기 위해, 나는 구조체를 선언 한 파일에서 5 개의 레코드를 읽으려고하지만 증분으로 인해 프로그램을 실행하려고하면 오류가 발생합니다. ("char studentName [20];"과 같은 것이 있으면 잘 작동합니다.) 원하는 결과를 얻기 위해 포인터를 어떻게 증가시켜야합니까? 그것은 포인터 표기법에 있어야합니다.증가 포인터

STUDENT* ptr = studentPtr; 

while (*count < MAX_SIZE) 
{ 
    fscanf(spData, "%s %*s %*s %*d %*d %*d %*d %*d", ptr->studentName) 
    (*count)++; 
    ptr++; 
} 

File Content: 

Julie Adams 1234 52 7 100 78 34 

Harry Smith 2134 90 36 90 77 30 

Tuan Nguyen 3124 100 45 20 90 70 

Jorge Gonzales 4532 11 17 81 32 77 

Amanda Trapp 5678 20 12 45 78 34 

그냥 마지막 질문 : 나는 선언하고 올바르게 메모리를 할당하여 내가 구조체를 유지 합니다. 내가 끝내면 어떻게 풀 수 있습니까? 이런 식으로해야할까요?

for (STUDENT* ptr = studentPtr; ptr < studentPtr + *count; ptr++) 
{ //*count is the number of records 
    free(ptr->studentID); 
    free(ptr->studentName); 
    free(ptr->studentScores); 
} 
    free(studentPtr); 
+3

'을하지만 내가 error'를 얻을 - 당신이 어떤 오류를받을 수 있나요? (http://www.toomuchcode.org/2008/11/guru-myth.html :-)에 링크하려는 유혹입니다. –

+0

구체적이지 않은 것을 유감스럽게 생각합니다. Xcode에서 "EXC_BAD_ACCESS (code = 1, address = 0 x 0)"를 얻었습니다.이 코드를 다른 컴파일러에서 실행하려고 시도했지만 실패했습니다. – KurodaTsubasa

+0

파일에서 데이터를 공유 할 수 있습니까? "\ n "또는 형식 지정자의 다른 문자가 있으면 각 항목을 하나씩 읽으십시오. 누락 된 항목을 알게됩니다. – Shubhansh

답변

2

문제는 studentPtr [0]의 필드에만 메모리를 할당했기 때문입니다. 표 A의 나머지 4 개 항목은 여전히 ​​0으로 설정됩니다.

이 시도 : 자신에 대한

int i; 
for (i = 0; i < 5; i++) 
{ 
    if ((studentPtr[i]->studentID = (char*) calloc (20, sizeof(char))) == NULL) 
    { 
     printf("Not enough memory\n"); 
     exit(100); 
    } 

    if ((studentPtr[i]->studentName = (char*) calloc (21, sizeof(char))) == NULL) 
    { 
     printf("Not enough memory\n"); 
     exit(100); 
    } 
    if ((studentPtr[i]->studentScores = (int*) calloc (5, sizeof(int))) == NULL) 
    { 
     printf("Not enough memory\n"); 
     exit(100); 
    } 
} 

사실, 개별 필드에 동적으로 할당 된 메모리를 사용하여, 당신이 만들고있는 삶 훨씬 어렵습니다. 코드와 시간을 요하는 각 필드를 명시 적으로 할당하고 나중에 해제해야 할뿐만 아니라 힙 테이블에 추가 메모리 오버 헤드가 발생합니다. 필드가 가변 크기 였지만 고정 크기이기 때문에 직선 배열이 훨씬 효율적입니다.

그래서,이로 끝날 것 :

typedef struct 
{ 
    char studentID[20]; 
    char studentName[21]; 
    int studentScores[5]; 
} STUDENT; 

STUDENT studentPtr[5]; 
+0

아, 실제로 다른 항목에 대한 메모리를 할당하지 않는다는 것을 알지 못했습니다. 고마워요! 도와 주셔서 정말 고맙습니다. 포인터를 배열로 인식 할 시간이 필요해 보인다. 네, 저는 고정 길이를 간단히 설정할 수 있다는 사실을 알고 있습니다. 그러나 구조 관리에서 각 요소에 대한 메모리를 동적으로 할당해야합니다. 대단히 감사합니다! – KurodaTsubasa

+0

제대로하려면 각 문자열을 큰 임시 버퍼로 읽고 문자열을 유지하는 데 필요한 정확한 메모리 양을 *, * malloc하여 마지막으로 문자열을 새 메모리로 복사해야합니다. – ams

+0

마지막 질문 하나. 구조체를 다 마친 후에 어떻게 구조체를 풀 수 있습니까? 게시물을 편집했습니다. – KurodaTsubasa

1

을 첫째로 방금 구조의 포인터 구조의 메모리보다 5 배의 메모리를 할당한다.

그리고 같은 줄에 사용자가 할당 한 구조 (5 개 구조)의 첫 번째 구조에만 메모리를 할당합니다.

당신은 당신이 추천 구조가로 5 회를해야한다 :

for (i = 0; i < 5; i++) 
{ 
//Do assignments to each element in structure not more than required 
//as you are doing in your code: 
studentPtr[i]->studentScores = (int*) calloc(5,sizeof(int)) 
//so your assignment of memory should be: 
studentPtr[i]->studentScores = (int*) calloc(sizeof(int)) 
} 
+1

calloc()의 결과를 캐스트하지 마십시오. 100 % 무의미하며 프로그램이 C90 컴파일러로 컴파일 된 경우 버그를 숨길 수 있습니다. – Lundin