2009-12-03 3 views
1

이름에 필드가있는 "승객"구조체가 있다고 가정 해 보겠습니다.왜 fread를 C에서 사용할 때 구조체를 char * 형식으로 변환하겠습니까?

는 (내 책의 구문을 보여줍니다처럼) 내가 할 경우

fread(&passenger, sizeof(Passenger), 1, in_fp); 
printf("%s", (*passenger).first_name) 

나는 세그먼트 오류를 ​​얻을 수 있지만 내가 할 경우 : 파일에서 읽어

fread((char *)passenger, sizeof(Passenger), 1, in_fp); 
printf("%s", (*passenger).first_name) 

이름이 될 것입니다 인쇄.

+1

작은 스타일 제안 : 'passenger-> first_name'은 포인터를 통해 구조체 필드에 액세스하는 일반적인 (그리고 더 읽기 쉬운) 방법입니다. 그것은 정확히 당신이 사용했던 표현과 같습니다.'(* passenger) .first_name' - 이것은 당신의 문제와 아무런 관련이 없습니다. 이것은 단지 더 받아 들여진 스타일 일뿐입니다. –

답변

3

당신은 아마 여객, 여객에 대한 포인터를 가지고있다.

+0

그래서 "승객"주소를 부름으로써 주소를 지정 했으므로 올바른 앰퍼샌드가 필요하지 않습니까? – kevin

+0

foo (& 승객)와 함께 호출 – kevin

+0

"승객"선언을 두 번 살펴보십시오. Passenger에 대한 포인터 여야합니다. 그렇지 않으면 코드가 컴파일되지 않습니다. 따라서 변수 "passenger"의 값은 해당 Passenger 구조에 대한 포인터입니다. fread 함수는 데이터를 쓰는 버퍼에 대한 포인터를 원합니다. 따라서 데이터는 문제의 승객에게 기록됩니다.승객에게 & 연산자를 추가하면 승객 변수가있는 위치에 데이터가 쓰여지고 스택에있는 어딘가에 STACKOVERFLOW가 생깁니다. – hirschhornsalz

8

"승객"이 포인터 인 것처럼 보입니다. 승객 &을 가져 가면 포인터 주소가 fread에 전달됩니다. 그것을 캐스팅 할 때, fread에게 그것을 승객에 대한 포인터가 아닌 char 버퍼에 대한 포인터로 취급하도록 말하고 있습니다.

fread(passenger, sizeof(Passenger), 1, in_fp); printf("%s", (*passenger).first_name) 

가장 가능성이 당신이 원하는 무엇을 할 것인가 :

+0

글쎄, 여객 승객은 주에서 선언되었으므로 나는 foo (& 승객)를하고있다 – kevin

+2

코드 라인 (* passenger) .first_name이 주어지면 사실 일 수 없다. 그것은 포인터입니다. – bmargulies

+0

글쎄, 승객은'(struct passenger_struct *)'에 대한 typedef가 될 수 있습니다 :) – hobbs

3

C 언어 초기에 C는 void * 형식이 아니 었습니다 (나중에 나타 났으므로 C++에서 실제로 빌려 왔습니다). char *이 대신 일반 "원시 메모리"포인터 유형으로 사용되었습니다. 따라서 오늘날까지도 코드에서 일반 포인터 유형으로 char * 유형의 기본 사용을 볼 수 있으며 일반 포인터 컨텍스트에서 char *으로 명시 적으로 변환 된 다른 포인터 유형을 볼 수 있습니다. 나는 당신이 인용 한 코드가 그 특별한 이유 때문에 이것을한다고 생각한다. (거기이 char * 캐스트를 넣어 당신을했다하지 않는 한.이 경우 난 단지 요청할 수 있습니다 "왜?".)

현대 C에서 fread의 첫 번째 매개 변수는 캐스트가 필요 없다는 것을 의미 void * 유형이 있습니다. 이

fread(passenger, sizeof *passenger, 1, in_fp); 

도 제대로 작동합니다.

&passenger 버전은 의미가 없습니다. 원래의 의도는 포인터 객체 passenger이 아닌 passenger이 가리키는 위치로 데이터를 읽는 것이 분명했기 때문입니다.

+0

void * 대신 char *를 사용하더라도 캐스팅은 필요하지 않습니다. –

+0

더 완벽하게하기 위해 역사적인 불평을 내 대답으로 복사하면 되겠습니까? – bmargulies

+0

아니요, 괜찮습니다. – AnT

관련 문제