2012-04-18 3 views
0

함수에 다음 코드가있는 경우 오류가 발생하지 않고 아무 문제없이 컴파일 할 수 있습니다. 일단 전역 범위에 넣으면 "여러 개의 다른 오류와 함께"크기가 0 인 배열을 할당 할 수 없습니다 "오류가 발생했습니다. 왜 이런 일이 일어나고 어떻게 오류를 없앨 수 있습니까? 나는 전역 변수의 위험을 알고있다. 이것은 단지 간단한 테스트 케이스 일 뿐이다.왜 전역 스코프 내 배열 첨자에 액세스 할 수 없습니까?

int* intest[2]; 
intest[0] = new int; 

답변

1

전역 범위에서 선언 할 수 있지만 new 연산자 나 할당은 사용할 수 없습니다. 따라서 전역 범위에서 int * intest [2] 선언이 필요합니다. 모든 코드에서 볼 수 있지만 C++에서는 main 코드의 순서대로 new를 사용해야합니다. (아마 애플 리케이션을위한 시작 기능의 일종).

EDIT : @phresnel에서 지적한대로이 범위에서는 new 연산자를 사용할 수 있지만 할당은 아닙니다 (이것은 비정상적이지만 불법은 아닙니다). 당신을 위해 작동 개시로 사용되는 다음과 같은 새로운 사업자 그러나 :

int *x[2]={new int,new int}; 

등 글로벌 버퍼의 일반적인 사용에서이 매우 낙담하고 안티 패턴 간주됩니다 - 당신은 당신이 아마해야 그것을 사용하지 않도록 할 수 있습니다.

+0

이상한데 왜 전역 변수에 새 값이나 할당을 사용할 수 없습니까? – judeclarke

+1

@judeclarke : 그것은 단지 약간의 온 전성을 보존하는 것입니다. 네임 스페이스 범위에 일반적인 문을 넣을 수 있다면 별도의 컴파일을 고려하여 어떤 순서로 실행해야합니까? 이것이 초기화에 대한 "전역 초기화 실패"라고하는 문제입니다. 당신은 * 초기화 할 때 어떤 효과가있는 표현식을 넣을 수 있습니다. 이것은 C++의 적절한 모듈이 부족한 것과 관련이 있습니다. –

+1

-1 : 물론 전역 범위에서'new'와 할당을 사용할 수 있습니다. 예 :'int * x, * y = x = new int; int main() {}' –

0

AFAIK, 전역 범위는 definedeclaration 만 허용합니다. 반면에 intest[0] = new int;은 c/C++ 컴파일러가 컴파일하는 동안 실패하는 할당입니다.

intest[0] = new int; 

가 없습니다 :

+0

왜 이것이 허용되지 않습니까? – judeclarke

+0

c/C++ 규칙입니다. c/C++는 첫 번째 라인 코드에서 마지막 라인 코드까지 실행되는 스크립트 언어가 아니지만 모든 실행 코드는 메소드에 있어야하며 ** main ** 메소드에서 시작해야합니다. – Sylvester

1
int* intest[2]; 

그러나 로컬 범위에서 유효 배치입니다.

차이점은 위쪽 변수는 초기화 구문 (변수 생성)이고 하위 변수는 코드 세그먼트입니다.

코드는 이어야합니다.은 글로벌 범위에서 호출 할 수 없습니다. 예를 들어 전역 범위에서 함수를 호출 할 수 없습니다. 언제 그 기능을 부르겠습니까?

전역 범위에서 원하는 변수의 수를 만들 수 있지만 글로벌 변수를 초기화 할 때 호출되는 생성자를 제외하고는 코드를 실행할 수 없습니다.

당신과 같은 코드를 실행하려면

: 그것을 실행하는 경우는 메인 또는 다른 기능 여물 실행해야

intest[0] = new int; 

, 그렇지 않으면 프로그램은 을 모르는 것입니다.

+0

무슨 뜻인지 이해하겠습니까? – David

관련 문제