2013-05-22 2 views
1

나는이 C 프로그램을 가지고있다. 내가 직장에서 컴퓨터에서 프로그램을 실행하면c 프로그래밍 segfault unitialised int?

int indexLength; 
char *args[1024]; 
while(args[indexLength]) 
    indexLength++; 

는, while 루프 라인은 나에게 indexLength 어떤 말도 임의의 값을 걸릴 segfault..and을 제공합니다. 하지만 집에서 리눅스 머신으로 프로그램을 실행하면 segfault가없고 프로그램이 정상적으로 실행됩니다.

내가 2 대의 컴퓨터 사이에서 생각할 수있는 유일한 차이점은 gcc4.7 레드햇 버전이 있고 페도라 OS를 실행 중이며 집에있는 컴퓨터가 ppa 저장소에서 gcc4.7을 다운로드 받았으며 우분투 운영 체제. 하지만 그게 유일한 차이라고 확신하지는 않습니다! 그것은 무엇 일 수 있는가?

편집 : 죄송합니다. segfault는 컴퓨터에서 indexLength = 0으로 초기화하면 사라졌습니다.

+1

정의되지 않은 동작 참조 : http://en.wikipedia.org/wiki/Undefined_behavior –

+0

indexLength의 초기 값을 알 수 없으므로이 질문에 대답 할 수 없습니다. – KevinDTimm

+0

'indexLength'는 경계를 넘어서는 불확정 값을 갖습니다. args 배열의. – hmjd

답변

5

초기화되지 않은 메모리에서 읽는 것은 정의되지 않은 동작입니다. 변수는 기본적으로 초기화되지 않으므로 indexLength은 할당 할 때까지 어떤 값을 취할 수 있습니다. 동작이 정의되어 있지 않으므로 프로그램이 일부 컴퓨터에서 실행될 수 있으며 다른 컴퓨터에서 충돌 할 수 있습니다.

args이 초기화되지 않은 상태로 유지되므로 indexLength을 초기화해도 정의되지 않은 동작이 해결되지 않습니다. 즉, 프로그램이 배열의 끝에 도달하면 멈추지 않고 할당 된 영역의 끝을지나 값에 액세스 할 수 있습니다. 물론 배열의 모든 값은 0이 아니어야합니다. 따라서 배열의 끝까지 도달하기 전에 멈출 수 있습니다. 그러나이 정의되지 않은 동작을 수정하려면 값에 액세스하기 전에 인덱스를 확인해야합니다.

+0

아하 그래서 정의되지 않은 행동입니다. 더 안전하게 코드 작성하는 법을 배우십시오. – ImNoob

+0

@ImNoob 예, 정의되지 않은 동작입니다 : [valgrind] (http://valgrind.org/)를 사용하여 감지 할 수 있습니다. 이 바보 같으면 – dasblinkenlight

+0

나를 용서해주십시오. 왜 어떤 머신은 정의되지 않은 동작을하는 코드를 실행하지만, 그렇지 않은 코드는 있습니까? – ImNoob

3

코드는 정의되지 않은

  • args가 초기화되지 않은되는 행동 때문에 각 요소가 예측할 수없는 값을 포함를 호출합니다. 어쩌면 스택의 다음 4k에서 NULL 포인터를 발견하고 루프를 빠져 나올 수 있습니다. 당신이 당신의 배열의 끝을지나 길을 읽을 수 있도록 어쩌면 당신은 당신은 즉시
  • args의 끝을지나 읽기의 효과도 예측할 수
  • indexLength가 초기화되지 않은되는 배열의 끝을지나 읽을 수 있습니다되지 않습니다. 이것은 잠재적으로 indexLength=0 실제로 코드가 안전하지 않은 설정, 당신은 초기 모습에도 불구하고 프로세스

에 대한 판독 가능 메모리의 한계에 도달하기 전에 제로 단어를 찾을 수없는 경우라고, 충돌이 포함되어 있습니다. 아직 초기화되지 않은 메모리를 읽었으므로 args 안에 NULL 요소를 찾는 것에 의존하고 있습니다. 이것을 찾을 수있는 방법은 없습니다. 배열이 끝나기 전에 루프가 종료되지 않으면 정의되지 않은 동작으로 돌아가므로 반복적으로 프로그램이 중단 될 수 있습니다.