2015-01-17 4 views
3

저는 알고 있습니다. 다른 세분화 오류 질문 ... 교수용 함수 enterValue을 실행하려고하지만 세그먼트 오류 오류가 계속 발생합니다. 나는 잘못한 일을하고 있는가, 아니면 그의 코드에 잡히지 않은 버그가 있는가? int* length; 선언은 실제로 원래 코드로 int length;으로 작성되었습니다. 최종 인수 valuePtr이 int에 대한 포인터가되도록 의도되었으므로, 그 인수는 length을 다음과 같이 정의해야한다고 생각합니다. 나는이 프로그램을 실행할 때int 포인터 인수를 사용하는 동안 C에서 세분화 오류가 발생했습니다.

#include <stdlib.h> 
#include <stdio.h> 

#define MAX_LINE  256 

char line[MAX_LINE]; 

int*  length; 

void enterValue  (const char* descriptionPtr, 
        int   min, 
        int   max, 
        int*   valuePtr 
        ) 
{ 
    do 
    { 
    printf("Please enter the %s (%d-%d): ",descriptionPtr,min,max); 
    fgets(line,MAX_LINE,stdin); 
    *valuePtr = strtol(line,NULL,10); 
    } 
    while ((*valuePtr < min) || (*valuePtr > max)); 

} 

int main() 
{ 
    enterValue ("number of numbers", 1, 256, length); 
    return(EXIT_SUCCESS); 
} 

, 나는 다음과 같은 얻을 :

Please enter the number of numbers (1-256): 4 
Segmentation fault 

답변

4

네, 당신은 int length의 원래 선언을 떠난 것이다. int로 인수를 포인터를 만들고, 함수가 변수에 쓸 수

enterValue ("number of numbers", 1, 256, &length); 

으로 호출에 대한 포인터를 전달합니다.

내 포인터의 길이를 —으로 만들고 특히 포인터의 위치를 ​​초기화하지 않음 — "임의 메모리에 쓰기"알고리즘을 만들었습니다.

+0

오 세상에, 나는 그런 바보 야. 모든 사람의 시간을 낭비해서 죄송합니다 :-) – user1185790

+2

@ user1185790 : 땀이 없습니다. 실수하는 것은 우리가 배우는 방법입니다. 처음에 모든 것이 "잘된 것"이라면 어떻게 배울 수 있을지 상상해보십시오! – wallyk

3

entervalue 함수를 호출 할 때 정수 포인터가 아무 것도 가리키고 있지 않습니다. 정수 포인터 length이 정수를 가리 키도록 length = &some_integer;을 가져야합니다. length 처음 내가 볼

1

두 실수가 아닌 포인터

int length; 

두 번째가 될이 기능을 수정할으로, length의 주소를 통과하지 않아야 length

enterValue ("number of numbers", 1, 256, &length); 
관련 문제