2010-07-22 4 views
1

구조체가 Header 파일에 정의되어 있는데,이 클래스의 메서드 중 하나에서 Struct을 사용하려고합니다. 그것은 다음과 같이 기본적으로 같습니다 내 클래스 정의 위의 헤더에구조를 사용하려고 할 때 오류가 발생하는 이유는 무엇입니까?

struct example 
{ 
    double a; 
    int b; 
    ... 
}; 

다음 CPP 파일에, 나는이 :

void exampleclass::test(){ 

    struct example *teststruct; 
    teststruct->a = 0; //This line causes a access violation 

} 

를 내가 여기에 오류가 왜? 나는 확실히 뭔가 잘못 clompletly 여기에, 나는 거대한 구조 신인이라고해야합니다.

+1

(http://stackoverflow.com/questions :

당신은 최대 말한 것처럼 teststruct 메모리를 할당하거나 스택에 생성하고 같은 뭔가를하거나 필요/388242/the-definitive-c-book-guide-and-list)를 읽고 올바르게 배우십시오. – GManNickG

+1

@ 그만 - 적어도 그는 [강좌를 가르치고 있지 않다] (http://stackoverflow.com/questions/3311006/strange-c-exception-definition "강좌를 가르치다") –

답변

7

구조체에 메모리를 할당하는 방법은 무엇입니까? 같은

뭔가 :

example* teststruct = new example; 
teststruct->a = 0; 
+0

이것은. 벤, 포인터를 선언했지만 구조체의 인스턴스를 가리 키지 않았습니다. –

+0

이것은 효과가 있습니다. 왜 내가 메모리를 할당 할 필요가 없다고 생각하는지 모르겠다. – Ben313

+1

@Ben : 가리키는 것을 사용하려면 포인터가 뭔가를 가리켜 야합니다. 물론 여기에는 포인터를 사용할 이유가 없습니다. – GManNickG

4

struct example *teststruct; 구조체 example의 인스턴스에 대한 포인터입니다. (그런데 C++은 struct이라는 접두사가 필요하지 않습니다.)

그래서 example은 무엇입니까? (힌트 : 아무 것도 아니요, 변수를 초기화하지 않았습니다.) 동적 할당 : . *

물론 동적 할당보다 자동 (스택) 할당을 선호합니다. *

example teststruct; 
teststruct.a = 0; 

을 그리고 당신은 실제로이 같은 원료 할당을 처리해서는 안 : 그냥 않습니다. 스마트 포인터에 넣어. 최소한 std::auto_ptr입니다.

3

teststruct은 메모리에 임의의 위치를 ​​지정하여 액세스하므로 teststruct->a = 0;은 정의되지 않은 동작 영역으로 안내합니다. 따라서 운이 좋으면 즉각적인 오류 (액세스 위반, 버스 오류, 세그먼테이션 오류 등)가 있거나 문제없이 실행됩니다. 당신은 [좋은 책]을 얻어야한다

struct example teststruct; 
teststruct.a = 0; //This line does not cause an access violation 
관련 문제