2012-06-26 2 views
0
#include<iostream> 
#include<stdlib.h> 
#include<string.h> 
#include<stdio.h> 

using namespace std; 

union type{ 
      int a; 
      char b; 
      int *p; 
      char *s; 
      int arr[10]; 
}; 

int fn(union type *exp){ 

    exp->p = exp->p+1; 
    cout << *(exp->p); 
    cout << "\n"; 
return 0; 
} 

int main(){ 

    union type *str; 
    str->a = 10; 
    str->b = 'n'; 
    str->p = &(str->a); 
    cout << (str->p); 
    cout << "\n"; 
    fn(str); 
    cout << str->p; 
    cout << "\n"; 
return 0; 
} 

이 코드는 세그먼트 오류를 ​​발생시킵니다. 그것은 malloc을 사용하여 명시 적으로 union에 메모리를 할당해야하기 때문입니까? 나는 코딩에 익숙하지 않고 C++를 배우려고 노력하고 있습니다.코드 세그먼트 화 오류

+4

'malloc'을 사용하여 C++를 배우려고하면 이상한, 무의미한 노동 조합이 너를 멀리하지 않을 것이다. FAQ에 좋은 책 목록이 있습니다. – chris

+0

str이 형식이 아닌 형식에 대한 포인터가되어야하는 이유가 있습니까? *를 * 삭제하고 모든 ->를.으로 변경하면 모든 것이 작동합니다. (음, fn 프로토 타입에서 *를 & 대신에 &로 바꾸고 싶을 수도 있습니다. – abarnert

+0

또한 malloc str (또는 비 포인터로 대체)을 사용하더라도 fn (str)은 다음과 같이됩니다. 실패합니다 (그러나 운이 좋다면 segfault는 아닐 것입니다). str-> p를 str 자체에 대한 포인터로 설정 한 다음 증분하여 str보다 중간 인 sizeof (int) 바이트를 가리키게됩니다. str의 중간 또는 str 뒤에 오는 객체 또는 초기화되지 않은 메모리, 어느 것도 int로 인쇄하고 싶지 않은 것입니다. – abarnert

답변

3

이 코드는 세분화 오류를 발생시킵니다. 내가 malloc을 사용하여 명시 적으로 노동 조합에 메모리를 할당해야하기 때문입니까?

오른쪽. str 포인터가 유효한 메모리 위치를 가리키고 있지 않으며 초기화되지 않았습니다. 따라서 을 작성하기 전에 str을 설정해야합니다.

+0

나는이 코드를 코드에 추가했고 작동했다 : str = (union type *) malloc (sizeof (type)); – newbie555

1

공용체에 대한 포인터를 선언하고 있지만 포인터가 유효한 메모리를 가리 키지 않습니다.이 포인터는 malloc/new 중 하나 여야합니다. 그것이 가리키고있는 것은 정의되어 있지 않습니다 (쓰레기 포인터).