2013-07-19 4 views
0

이 코드는 컴파일 중이지만 실행 중에 충돌합니다.파일에서 구조체 배열로 문자열 복사 중 오류가 발생했습니다.

typedef struct student{ 
    char name[ 20 ]; 
    char last[ 20 ]; 
    unsigned long int ID; 
    char email[ 20 ]; 
    char BA[ 4 ]; 
} *stu; 

stu source[ 20 ]; 

for(int i=0; i<11 ;i++) //copy from file to array 
{ 
    if(fscanf(f1 ,"%s%s%u%s%s", &(source[ i ]->name), &(source[ i ]->last), &(source[ i ]->ID), &(source[ i ]->email), &(source[ i ]->BA)) == EOF); 
} 

이가 충돌 때 나타납니다 코드입니다, 그것은이 라인에 중지 내가 오류 메시지가 "처리되지 않은 예외에서이

#ifndef _UNICODE 
    *(char *)pointer = (char)ch; /* stops on this line */ 
    pointer = (char *)pointer + 1; 

입니다 (팝업 창 이름은 input.c입니다) ... in ... exe : 0xC0000005 : 액세스 위반 작성 위치 0xccccccc ".

이유를 아는 사람이 있습니까?

+0

무엇을의 무의식적으로 포인터를 사용하면 포인터는 가리키는 포인터만큼 좋은 것입니다. –

+0

파일의 내용은 무엇입니까? 왜 그 코드 블록이 비어있는 문장이? – Antonio

+2

"달리면서 달리다"는 버스를 타는 동안 사랑에 빠지는 것을 의미합니다. 당신이 찾고있는 단어는 "충돌"입니다. –

답변

2

당신은 입력 :

typedef struct student{...}*stu; 

그것은 구조체에 대한 포인터, 당신은 그냥 아무것도하지 않고 20 포인터의 배열을 선언, 당신이 모르는 경우하지의 유효 영역에 가장 가능성이 포인터 점, 기억.

은 이런 식으로 선언 :

struct student source[ 20 ]; 

또는 동적 할당을 사용하지만, 나는 귀하의 경우에는 필요하지 않습니다 같아요.

+0

시도해 보면 컴파일러가 화가났다 : \ –

+0

@OmerAndrewSanMiguel 막연하고 질문을 편집하여 컴파일러 오류를 추가하십시오. –

+1

'struct student source [20]'이어야합니다, 그렇지 않아야합니까? – alk

0

stu 앞의 '*'만 제거하면됩니다.

설명 : 두 가지를 혼합했습니다. 이 경우

typedef struct student newName; 

:

struct student var; 

그것의 이름 변경 :

struct student{ 
    char name[ 20 ]; 
    char last[ 20 ]; 
    unsigned long int ID; 
    char email[ 20 ]; 
    char BA[ 4 ]; 
}; 

하여 구조의 선언은 바로이 같은 변수를 선언해야하고 경우 다음과 같은 변수를 선언해야합니다.

newName variable; 
0 당신은이 같은 스투 전에 '*'제거해야

typedef struct student{ 
    char name[ 20 ]; 
    char last[ 20 ]; 
    unsigned long int ID; 
    char email[ 20 ]; 
    char BA[ 4 ]; 
} *stu; 

: 그래서 당신의 코드

다음

typedef struct student{ 
    char name[ 20 ]; 
    char last[ 20 ]; 
    unsigned long int ID; 
    char email[ 20 ]; 
    char BA[ 4 ]; 
} stu; 

그리고

선언이처럼 변수 :

stu source[20]; 
관련 문제