2012-06-30 6 views
6

다음 C 코드는 "세그먼트 화 오류"오류를 반환합니다. 나는 그것이 왜 값 20을 돌려주지 않는지 이해하지 못한다. 나의 실수는 무엇인가? 당신의 int 당신은 공간을 할당하지 않은C에서 값을 인쇄하려고 할 때 세그먼트 화 오류가 발생했습니다.

#include <stdio.h> 

int main() 
{ 
    int* n; 
    *n = 20; 

    printf("%i\n",*n); 

    return 0; 

} 
+0

'N'은 초기화 포인터는 라인 역 참조하는 값 '* N = 20 '. 포인터를 사용하려면 포인터를 참조 해제하기 전에 올바른 메모리 위치를 가리 키도록 포인터를 초기화해야합니다. – reuben

+0

이미 주어진 대답에 대한 대안으로,'int n = 20'과'& n' (n의 주소)를 전달할 수 있습니다. – Vassilis

답변

14

당신은 너무, n로 지정되지 않은 메모리를 쓸 수

*n = 20; 

시도 메모리를 할당하지 않았습니다.

당신은 쓰레기 값에 20를 작성하려고

#include <stdlib.h> 

int *n = malloc(sizeof *n); 
/* use n */ 
free(n); 
+1

완료되면 n을 잊지 마세요! –

+0

좋은 지적입니다. –

4

, 당신은 단지 int포인터을 선언했습니다.

포인터가 초기화되지 않았으므로 메모리의 알 수없는 공간에 쓰는 것이 정의되지 않은 동작이므로 문제가 발생합니다. 일반적으로 segfault가 발생합니다.

당신은 malloc를 사용하여 정수를위한 슬롯을 할당 할 수 있습니다 :

n = malloc(sizeof(int)); 

을 그리고 나중에 메모리를 확보 할 free에 해당 호출을 사용 :

free(n); 

을하지만,에 대해 하나의 슬롯을 할당 정수는 매우 드문 경우이지만 일반적으로 스택에 int을 할당합니다.

int n; 
n = 20; 
1

보십시오. *alloc() 함수 중 하나를 사용하거나 스택에 int를 만들고 해당 값을 얻는 방법으로 공간을 할당해야합니다 (주석에 언급 된 Richard J. Ross III와 같이).

동적 할당 :

int n*; 
n = malloc(sizeof(int)); /* allocate space for an int */ 
if(n != NULL) { 
/* do something.. */ 
free(n); /* free 'n' */ 
} else { 
    /*No space available. */ 
} 

또는 스택 :

int int_on_stack; 
int *n = &int_on_stack; 
*n = 20; 
printf("%i\n", *n); // 20 
+1

'malloc'만이 유일한 해결책이 아니라는 점에 유의하십시오. 'mmap','alloca'가 있으며 스택에 int를 만들고 주소를 얻는 것입니다. –

+0

@ RichardJ.RossIII : 감사합니다. 업데이트 됨. – Jack

+0

귀하의 스택 예제는 "그것의 앤레스 받기"와 일치하지 않습니다. 당신이 원하는 것은'int onstack; int n = & onstack; * n = 20; printf ("% i \ n", * n); '... 안녕하세요, 권한을 수정 했으므로 앞으로 나가서 변경했습니다. –

관련 문제