2014-09-30 4 views
3

두 변수의 값을 바꿔 쓰려고 시도하는 동안 세그멘테이션 오류가 발생합니다. 내 코드는 다음과 같습니다C. 세분화 오류 포인터를 사용하여 두 값을 바꿔 쓰려고 시도합니다.

void swap(int *a,int *b){ 
    int *temp; 
    *temp=*a; 
    *a=*b; 
    *b=*temp; 
} 
int main(){ 
    int i=1,j=0; 
    printf("Before %d,%d\n",i,j); 
    swap(&i,&j); 
    printf("After %d,%d\n",i,j); 
    return 0; 
} 

내가 오류 다음 무엇입니까 :

나에게 신비 보이는 무엇
Before 1,0 
After 0,1 
Segmentation fault (core dumped) 

이 값이 성공적으로 교환 한 후 오류가 생산되고있다. 버그 란 무엇입니까? 어디에서나 포인터를 타입 변환해야합니까?

+1

이 라인 : INT의 * 온도; 라 라 (la-la) 땅을 가리키는 포인터입니다. 코드는 다음을 수행합니다. * temp = * a; 결과는 일부 값이 '일부'알 수없는 위치에서 메모리를 밟았습니다. (아마도 프로그램의 주소 범위에있을 것입니다.) 나중에 메모리가 손상되면 seg 오류가 발생합니다 .3 xor 문을 사용하여 스왑을 수행하는 것이 훨씬 더 좋습니다. 임시 변수가 없으며 3 명령 만 사용하고 메모리 손상에 대한 걱정이 없습니다. – user3629249

답변

11

포인터 int *temp; 점이 없습니다.

따라서 프로그램이 *temp=*a; 일 때 a 값을 임의 메모리 블록에 넣습니다.

void swap(int *a,int *b){ 
    int temp; 
    temp=*a; 
    *a=*b; 
    *b=temp; 
} 

업데이트 :

이 수정을 시도

추가 질문 :

내가 포인터 변수로 아닌 일반 변수로 온도를 사용한다고 가정, 내 프로그램을 실행시킬 수있는 방법이 있습니까 아니면 내 고집을 떠나야합니까?

답변 : 당신이 시도 할 수 있습니다 :

void swap(int *a,int *b){ 
    int *temp; 
    temp = malloc(sizeof(int)); 
    if (temp == NULL) 
     return; 
    *temp=*a; 
    *a=*b; 
    *b=*temp; 
    free(temp); 
} 
+0

'temp'를 포인터 변수로 사용하고 일반 변수로 사용하지 마십시오. 내 프로그램을 실행하는 방법이 있습니까? 아니면 내 고집을 떠나야합니까? – Gaurav

+0

@Gaurav하지만 왜 그걸 원하니? – Will

+0

@llya를 사용하기 전에 free (temp) temp = NULL을 사용하여 아무 것도 가리 키지 않도록하십시오 ... – Ajay

3

귀하의 swap 기능은 잘못된 것입니다. 그것은이 스왑 기능

void swap(int *a,int *b){ 
    int temp = *a; 
    *a= *b; 
    *b= temp; 
} 
1

사용되어야한다 : -

void swap(int *a,int *b){ 
    int temp; 
    temp=*a; 
    *a=*b; 
    *b=temp; 
    } 
관련 문제