2017-02-22 2 views
-1
#include <stdio.h> 

int main(void) { 
    int n,i; 
    int str[n]; 

    scanf("%d\n",&n); 
    for(i=0;i<=n;i++) 
    { 
     scanf("%d",&str[i]); 
     printf("%d th %d\n",i,n); 
    } 
    return 0; 
} 

입력 :내 프로그램에서 일곱 번째 변수 6이 왜입니까?

10 

8 9 2 1 4 10 7 6 8 7 

출력 :

0 th 10 

1 th 10 

2 th 10 

3 th 10 

4 th 10 

5 th 10 

6 th 10 

7 th 6 

왜 출력 6입니까? 이 불확정 값을 가지고있는 동안 코드

int n,i; 
int str[n]; 

에서

+1

C는 선언적 프로그래밍 언어가 아닌 필수 프로그래밍 언어입니다. 대략 프로그램이 라인별로 실행된다는 것을 의미합니다. 'n '이 바뀌면 자동적으로 그 크기를 갱신 할 배열을 선언 할 수 없다. ** 선언 시점에서'n' ** 크기의 배열 만 선언 할 수있다. – StoryTeller

+0

질문은 (i) 잘 쓰여지고, (ii) 짧은 컴파일 가능한 코드를 포함하며, (iii) 실제 결과를 문서화하며, (iv) 예상 출력을 문서화합니다. 그리고 두 명의 기존 사용자가 좋은 답변을 제출 했으므로이 질문에 더 많은 신뢰성을 부여합니다. 그럼 왜 downvote? – Bathsheba

+1

@Bathsheba 아마도 그가 C의 "기본 개념"을 얻지 못했음을 보여주는 질문이기 때문에 나쁜 질문이고 그는 나쁜 사람입니다.) –

답변

2

당신은 초기화되지, n을 사용하고 있습니다. undefined behavior을 호출합니다.

구체화하기 위해, n은 명시 적으로 초기화되지 않는 한 불확정 값을 포함하는 자동 지역 변수입니다.

해결 방법 : 당신은 당신이 사용자로부터 값을 가지고 (소독) 한 int str[n]; 후 정의 할 필요가있다.

그런 다음 다시 한 번 문제가 발생합니다. 배열에 대한 루프가 하나씩 실행됩니다. C는 0 기반 배열 인덱싱을 사용하므로 크기가 n 인 배열의 경우 유효한 인덱스는 0에서 n-1이됩니다. 루프 구조가 있어야합니다

for(i=0; i<n; i++) 
4

이것은 정말 정의되지 않은 동작을하는 이상한 코드입니다. 당신은 무엇을 기대합니까 :

int n; // No value! 
int str[n]; 

할 일? str 선언 시점에 n 값이 없으므로 길이가 알려지지 않은 배열을 얻습니다. 다시 nscanf()에 의해 값을 부여 마술 str[n] 라인에 "시간 여행"에 컴파일러를 예상하는 경우 공동의 작동 방식을

, 그럼 ... 그게 아니에요, 그리고 당신이 정말로 언어 A를 읽어합니다 조금 더. 그리고 귀하의 환경에서 얻을 수있는 모든 경고를 컴파일하십시오. 이 n이 값은 for 루프 초과 배열을 가지고 다시 당신에게을 정의되지 않은 동작 을 제공하므로이 확정 된 경우에도 추가 세부 사항으로

. 색인 0 기반이므로

크기 m의 어레이

루프 헤더는 안 m에서 인덱스, 즉 어레이 바깥의 수 ,

for (size_t i = 0; i < m; ++i) 

를 판독한다.

+0

흥미롭게도 C++의 액터를 사용하여이 "시간 여행"속성을 설계 할 수 있습니다. 방법으로 좋은 대답. – Bathsheba

0

문자열 str []의 크기 값은 아직 정의되지 않았습니다. 문자열/배열을 선언하기 전에이 값을 초기화해야합니다.

gcc를 사용하여 컴파일하는 경우 컴파일 라인에 -Wall 플래그를 포함시켜 이와 같은 오류를 catch하십시오.

관련 문제