2017-12-14 6 views
-2

그래서이 사이트에서 C++은 가변 길이 배열을 허용하지 않지만 gcc는 허용합니다. 그래서,gcc에서 가변 길이 배열을 사용하는 방법은 무엇입니까?

#include<stdio.h> 
#include<stdint.h> 

void main() 
{ 
    int8_t n; 
    int8_t var_array[n]; 
    int8_t i; 
    printf("Enter array size: \r\n"); 
    scanf("%d", &n); 

    for(i=0; i<n; i++) 
     var_array[i] = i; 

    for(i=0; i<n; i++) 
     printf("var_array[%d] = %d\r\n", i, var_array[i]); 
} 

코드와 함께 컴파일 작은 코드를 테스트하고 싶었다 "GCC var_array.c -o var_array"나는 그것을 실행할 때 리눅스 OS에서 명령하지만, 내가 얻을 분할 오류 오류

Enter array size: 
5 
Segmentation fault 

내가 뭘 잘못하고 있니?

+2

*이 사이트에서 C++은 가변 길이 배열을 허용하지 않습니다. * - 아니요,이 "사이트"가 아닙니다. 이것들은 표준위원회가 정한 C++ 규칙입니다. C++ 배열은 변수가 아닌 항목의 수를 나타내는 상수 표현식을 사용해야합니다. – PaulMcKenzie

+0

@PaulMcKenzie 왜 남자를 만났어요? 내 평판에서 나는 신인이라고 말할 수 있습니다. 당신은 내가 "이 사이트에서 읽음"을 의미한다는 것을 알고있다. – KharoBangdo

+1

당신은'n' 값을주기 전에 배열 크기를'n' **으로 설정하고있다. 그 시점에서 아마도 ** 제로 **입니다 (그러나 그것은 아무것도 될 수 있습니다). – Galik

답변

5

%d 지정자와 마찬가지로 int으로 지정하십시오. (이전에는 큰 값의 경우 오버 플로우 할 수있는 8 비트 만 있기 때문에)

int n; 
    int i; 
    printf("Enter array size: \r\n"); 
    if(scanf("%d", &n) != 1){ 
     fprintf(stderr,"%s\n","Error in input"); 
     exit(1); 
    } 
    int var_array[n]; 
    for(i=0; i<n; i++) 
     var_array[i] = i; 
     ... 

사용자가 고유하지 않은 변수를 사용하고있었습니다. 그런 다음 어레이에 액세스하는 새 값 eof n을 기반으로합니다. 인덱스는 배열의 경계 밖으로 인덱싱되어 seg fault가 발생합니다.

int8_t을 입력 할 경우 scanf("%" SCNd8, &n);을 사용하십시오. int8_t 유형을 입력 할 수도 있습니다.

scanf의 반환 값을 확인해야합니다.

그래서 이상적인 호출

if(scanf("%d",&n) == 1){ 
    //...success..do work 
} 
+0

그러나'scanf'는 실패 할 수 있습니다. 위의 코드는 [정의되지 않은 동작]을합니다 (https://en.wikipedia.org/wiki/Undefined_behavior) –

+0

코드 덩어리의 4 번째 줄'scanf ("% d", &n); ' –

1

프로그램에서의 실수는

int8_t n;     //Here n is declared where n has random value 
int8_t var_array[n];  /*Now in this statement you have declared array 
          with the size of that random value*/ 

그래서 당신은 당신이 n의 입력 값을 얻을 수있는 것을 시정하기 위해, 그 오류입니다 것 var_array[n]