2013-01-08 5 views
2

구조체 1로 구조체 1을 초기화하는 것이 가능하다는 것을 알고 싶습니다. 나는 캐스팅의 개념에 새로운 있습니다. 이 코드의 출력은 0이어야합니다. 안내해주십시오. 감사!구조체를 다른 구조체로 초기화 할 수 있습니까?

#include<stdio.h> 

typedef struct student 
{ 
int roll_id[10]; 
int name_id[10]; 
int postn; 
} student; 

typedef struct exams 
{ 
int subject[10]; 
int area; 
}exams; 

int main() 
{ 
exams e= { {0} }; 
student *pptr= (student*)&e; 
printf (" %d\n", pptr->name_id[9]); 
return 0; 
} 

답변

2

유추는 간단하다
당신은 애플을 구입하고 은 오렌지입니다 척.
먹을 수있는 것으로 먹으면 오히려 먹을 수 있습니다.하지만 오렌지 주스를 먹을 것으로 예상되면 그 음식에 물린다면 실망하게 될 것입니다.

사과 & 주황색을 두 구조로 교체하고 컴파일러로 교체하십시오.

구조는 일반적으로 다른 데이터 형식에 의해 점유되는 메모리 블록 일뿐입니다.
컴파일러 구현시 구조의 첫 번째 유형을 제외하고 이러한 유형간에 padding bytes이 추가 될 수 있습니다.
두 구조의 첫 번째 유형은 같기 때문에 (은 10 개의 정수 배열입니다). 구조 exam을 다른 유형으로 가장하면 student이 작동하지만 첫 번째 유형 이외의 다른 데이터 유형에 액세스하려고하면 정의되지 않은 동작이됩니다.

정의되지 않은 동작은 코드에서 얻은 것입니다.

하단 :
이 작업을 수행 할 수 없습니다.

+0

내가 좋아하는 답변의 종류! – Benoit

+0

자세한 설명 주셔서 감사 드리며 그 최종선 :-)을 싫어합니다. –

+0

@AlokSave 유효한 코드 학생입니까? pptr = (student *) & e; 전체가 성공적으로 컴파일됩니다. –

0

우선 코드에서 structure1을 structure2로 초기화하지 않고 structure2에 대한 포인터를 structure1의 포인터로 가장하는 것입니다.

exams 구조 인스턴스가 분명히 이상한 정렬 설정은 물론 학생 instance보다 적은 메모리를 사용합니다. pptr->name_id[9]에 액세스하면 e 전용 영역을 지나치는 결과를 얻을 수 있습니다. 이제 모든 것은 컴파일러, 컴퓨터 등에 달려 있습니다. 그런 의미로 그 세부 사항을 파고 들지 않는 것이 좋습니다.

이 코드의 출력은 당신이 그것을 넘겨 전에 (e 과거)과 설정 스택이 제로로 가득 할당되지 않은 스택 영역에서 읽고 있다면 그것이 아마도 제로

수있다 실행중인 스레드

캐스팅 및 자동 메모리 및 인스턴스와 포인터에 대해 C 책에서 자세히 읽으십시오. 코드를 올바르게 말하면 정말 많이 있습니다. 주제에 대해 더 공부 한 후에 더 구체적인 질문을하는 것이 좋습니다. 행운을 빌어 요.

관련 문제