2016-08-26 3 views
0

C++을 배우고 싶습니다. 여기 초보자 용 질문입니다.중첩 된 구조체 C++

#include <iostream> 
#include <string> 

using std::cout; 
using std::endl; 

struct student{ 
    struct address{ 
     int no; 
     std::string city; //problem is here 
    }; 

    char grade; 
    int num; 
    address *addr; 
}; 

int main(){ 

    student st1; 
    student *pSt1 = &st1; 

    pSt1->grade = 'A'; 
    pSt1->num = 1234; 

    pSt1->addr->no = 123; 
    pSt1->addr->city = "Imladris"; 

    return 0; 
} 

이 충돌하지만이 같은 std::string city을 변경하지 않는 경우 : 어떤 경우에

struct student{ 
    struct address{ 
     std::string city; // here 
     int no; 
    }; 

    char grade; 
    int num; 
    address *addr; 
}; 

이 충돌하고 0을 반환하지 않습니다 ... 오류도 경고. 어쩌면 여기에 포인터를 사용할 필요가 없지만 제가 말했던 것처럼 저는 C++을 배우고 있습니다. 이것은 포인터/구조체에 대한 샘플 코드입니다.

나는 그것을 고치는 방법을 알고 있지만 왜 깨지는 지 이해하고 싶습니다. 나는 string city의 선언 순서를 변경하고 충돌하지 않는다. 왜?

+4

경고와 함께 컴파일하고 컴파일러를 청취하십시오. – Nelfeal

+3

그리고 "작동"과 "작동하지 않음"이란 의미 (컴파일 오류, 프로그램 충돌, 예기치 않은 결과 ...) – SJuan76

+1

"작동 여부"는 무엇을 의미합니까 ?? 우리에게 컴파일러 오류나 sth 같은 것을 보여주십시오. –

답변

1

방금 ​​Undefined behavior이라는 단어가 나타났습니다. 코드의 최종 결과는 컴파일러 및 플랫폼에 따라 다릅니다. 값이 지정되지 않은 포인터를 역 참조하는 것은 (here과 같이) 조작의 결과를 예측할 수없는 이러한 경우 중 하나로 간주됩니다.

0

당신의 중첩 구조를 유지하지만, 귀하의 회원이 추가 변수 선언 :

address *addr = new address();

을 또는 더 나은 방법이 언급 한 사용자 @tobi303로 사용하는 것입니다, 포인터로 단지를 선언하지 마십시오 대신 address의 예 :

address addr;

그러나이 방법 사용

0123을
pSt1->addr.no = 123; // set 
pSt1->addr.city = "Imladris"; // set 
+1

은 'addr' 멤버를 포인터로 만들 필요가 없다는 것을 언급 할 가치가 있습니다. – user463035818

+0

@ tobi303 - "어쩌면 여기서 포인터를 사용할 필요는 없지만 제가 말했던 것처럼 저는 C++을 배웁니다"라고 질문했습니다. 그것은 아마 책에서 운동입니다. –

+1

@ AdrianJałoszewski 나는 OP가 "아마도 포인터가 필요 없다"라고 말할 때 그는 필요하지 않은'pSt1 '을 참조한다고 생각한다. 'address'가 포인터 일 필요는 없다는 사실은 덜 명백합니다. 책에서 가져온 것이라면, 우물에서 .. 책에서 당신은 때로는 헛소리를 찾을 수 있습니다. – user463035818

관련 문제