2012-11-22 2 views
0

무엇이 누락 되었습니까? 별도의 함수로 카운터를 증가 시키려면 세그먼트 오류가 발생하는 이유는 무엇입니까? 널 포인터를 역 참조세그먼트 오류, 포인터 값 증가

int point(int *cow); 

int main() 
{ 
    int *cow = 0; 
    point(cow); 
    return(0); 

} 

int point(int *cow) { 
    (*cow)++; 
    return(0); 
} 
+0

잠시 동안 C를 수행하지 않았지만 메모리 값을 0으로 정의하지 않고 포인터를 메모리에서 0 위치로 정의하지 않았습니까? –

답변

4

어쩌면 당신이 대신하고 싶었다 C에서 동작이 정의되지 않습니다 :

int a = 0; 
int *cow = &a; 

point(cow); 

참고 임시 포인터 cow이 필요하지 않다고과 직접 전달할 수 있습니다 &a ~ point 기능.

+1

'point (& a)'는 아마도 충분했을 것입니다 ... –

2

다음과 같은 것이이 작업을 수행 할 수있는 좋은 방법 : 당신은 주에있는 포인터를 할 필요가 없습니다

void point (int *cow); 

int main() { 
    int cow = 0; // Create a simple int, not a pointer 
    point (&cow); // Pass address (&) of your int 
    return 0; 
} 

void point (int *cow) { 
    (*cow)++; 
} 

, 당신의 증가 함수에 포인터를 전달합니다.

1

널 포인터를 참조 해제하려고 시도하고 있습니다. 널 포인터가 프로그램을 확실히 중단시킵니다. 당신은 아마이 할 의미 : 원래 코드에서

int point(int *cow); 

int main() 
{ 
    int cow = 0; 
    point(&cow); 
    return(0); 

} 

int point(int *cow) { 
    (*cow)++; 
    return(0); 
} 

을, 당신은 포인터 - 투 - INT 생성 (예 : INT * 소),하지만 당신은 실제로 당신이 시도하는 값을 저장하는 int를 생성하지 증가. 다음은 위의 코드 변경 사항을 원래 코드와 결합한 올바른 예입니다.

행운을 빈다!

1
int *cow = 0; 

은 "암소"를 정수에 대한 포인터로 선언 한 다음 그 포인터에 값 0을 할당합니다. 그런 다음 point()로 전달하여 "0"을 참조 해제 한 다음 해당 메모리 위치에 저장된 값을 증가시킵니다.

대신을 시도해보십시오

int x = 0; 
int *cow = &x; 
point(cow); 
0

(정의 위키에서) (보통 세그 폴트 단축) 세그먼트 오류, 버스 오류 또는 액세스 위반이 일반적으로 CPU가 물리적으로 해결 할 수없는 메모리에 액세스하기위한 시도이다.

int *cow = 0;

프로그램이 메모리에 액세스하려고

는 유효한 주소하지 않기 때문에 당신이 분할 오류가 있습니다, 위 지적했다.