2017-11-21 1 views
0

main()에서 길이를 사용자 입력으로 사용하는 전역 배열을 가진 C 코드를 작성하려면 어떻게해야합니까? 전역 배열을 정의하는 방법 (길이를 다른 함수로 가져 오는 방법)?

나는 이렇게 많은 다른 방법을 시도했지만 그들 중 누구도 예를 들어 하나, 지금까지 일하지 : 당신은 분명히 할 수 없습니다

#include <stdio.h> 

const int length; 
int array[length]; 

int main() 
{ 
    scanf("%d",&length); 
} 
+1

'배열'선언시 '길이'가 정의되어 있지 않으므로 그렇게 할 수 없습니다. 대신에 ['malloc()'] (http://en.cppreference.com/w/c/memory/malloc)를 사용할 수 있습니다. –

+2

먼저'length'를'const'로 선언했습니다. 왜 당신이 그것을 바꿀 수/할당 할 수 있다고 기대합니까? (여기서'const'는 당신의 문제에 대해 전적으로 책임지지 않습니다.) – babon

답변

3

. length이 그 가치를 얻었을 때 소급 적으로 메모리 할당이 거슬러 올라가는 것을 예상합니까?

이것은 C가 작동하는 방식이 아니라 추상적입니다.

배열을 포인터로 만들어야합니다 (필요에 따라 extern을 선언 할 수 있음). 또한 길이를 별도 변수 (extern)로 지정해야합니다.

7

코드를 참조하면,이 가리킬 수 있습니다 : 컴파일 시간의 array의 크기를 알 수 있기 때문 물론 작동하지 않습니다

int array[length]; 

. 정적으로 크기가 정해지지 않은 배열 (컴파일 중 컴파일러의 관점에서)을 정의 할 수 없습니다!
배열 런타임 (즉, 동적)의 크기를 결정하려면 수행 한 방식으로 변수를 선언하여이를 수행 할 수 없습니다.

또한 constlength을 사용하면 여기에서 작동하지 않습니다. const을 제거하십시오.

할 수 있고해야 할 일은 int 포인터를 가져 와서 동적으로 할당되는 메모리의 시작 주소를 얻는 것입니다. malloc 기능을 사용할 수 있습니다. , 사용자가 예를 들어 10을 (즉, length = 10)을 입력 한 경우, 여기에서

int *ptr = malloc(length * sizeof(int)); 

:

나는 당신을 위해 모든 코드를 작성하지 않습니다,하지만이 비슷한을 보이는 포함해야 mallocNULL을 반환하지 않으면 ptr 포인터에 저장된 주소부터 최대 10 개의 정수를 저장할 수 있으며 물론 포인터 ptr을 증가시켜 액세스 할 수 있어야합니다.

malloc의 설명서 페이지를 읽는 경우 필요한 헤더 파일을 처리 할 수 ​​있어야합니다. 필자가 필요한 파일을 쓰지 않고있다. 필자가 직접 man 페이지와 코드를 읽고 싶기 때문이다.

-1

malloc을 사용하여 문제를 해결하려면 다음과 같이 동적 배열을 만들어야합니다.

#include<stdio.h> 
#include<stdlib.h> 
int *array; 
main() 
{ 
    int length; 
    scanf("%d",&length); 
    array = (int *)malloc (length*sizeof(int)); 
    // array[0] = 100; 
} 

배열 길이가 정수 범위에 맞거나 그에 따라 변경한다고 가정합니다.

+2

'studio.h'가 아니라'stdio.h '입니다. main의 정확한 프로토 타입은'main()'이 아니라'int main (void)'입니다. 'malloc'의 리턴 값을 던져서는 안됩니다. – mch

+0

몇 가지 제한된 즉각적인 도움을 줄 수있는이 코드 조각을 가져 주셔서 감사합니다. 적절한 설명을 통해 (* meta.stackexchange.com/q/114762) 왜 * 이것이 문제에 대한 좋은 해결책인지를 보여줌으로써 장기적인 가치를 향상시킬 수 있으며, 미래의 독자들에게 다른 유사한 질문. 귀하의 가정을 포함하여 몇 가지 설명을 추가하려면 답을 편집하십시오. –

0

파일 범위 (함수 본문 외부)에서 선언 된 배열은 static의 저장 기간을 갖습니다. 즉, 프로그램 시작과 동시에 명령문이 실행되기 전에 공간이 할당됩니다. 이 때문에 컴파일시에 크기를 알아야합니다.

런타임까지 전체적으로 볼 수 있지만 크기가 조정되지 않은 메모리를 할당하려면 동적 메모리 할당을 사용해야합니다.

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

int *array;  // personally, I would name these something like 
size_t length; // g_array and g_length to emphasize their "global-ness" 
       // and disambiguate them from any local variables. 

int main(void) 
{ 
    // get length value somehow 

    array = malloc(sizeof *array * length); 
    if (!array) 
    { 
    // Could not allocate memory, handle as appropriate 
    } 

    // do stuff with array 

    free(array); 
    return 0; 
} 
관련 문제