2012-01-31 3 views
1

나는 C 상당히 새로운 오전 그리고 난 다음 두 명령문은 동일한 결과를 생성하지 않는 이유를 이해하지 않습니다C에서 NULL에 대한 포인터의 동적 배열을 초기화하는 방법은 무엇입니까?

char *fields[14] = {NULL}; 

const int num_fields = 14; 
char *fields[num_fields] = {NULL}; 

옵션 1 개 작품,하지만, 옵션 2는 그렇지 않습니다. 그것은 "가변 크기의 객체가 초기화되지 않을 수도있다"고 경고하며 "경고 : 배열 초기화 자의 초과 요소"를 경고합니다. OSX에서 gcc 4.2.1을 사용합니다.

의견을 보내 주셔서 감사합니다.

+0

아마도 이것은 'const int'가 반드시 일정한 값일 필요가 없기 때문에 가능할 것으로 생각합니다. 나는 당신이 const에 대한 포인터를 얻고 기본 값을 수정할 수 있다고 믿는다. – Lazarus

답변

4

두 번째 개체는 VLA (Variable Length Array)라고하며 C99로 잘 정의되어 있습니다. 당신이 사용할 수 있습니다 원하는 것을 달성하기 : 문제의

for (i = 0; i < num_fields; i++) 
    fields[i] = NULL; 

요점은 const int num_fields14 매우 다른 점이다, 그것은 일정하지, 그것은 읽기 전용입니다.

+0

+1하지만 기술적으로는 초기화가 아니라 할당입니다. VLA는 그 자체로 초기화 될 수 없다고 말하는 것이 맞을 것 같습니다. –

+0

@ArmenTsirunyan 나는 표현을 바꿨다. – cnicutar

+0

설명해 주셔서 감사합니다. – DrDee

1

num_fields에는 const 한정자가 있지만 여전히 컴파일러에서 변수로 간주됩니다.

따라서 가변 크기 배열을 선언하려고 시도하면 초기화 프로그램 ({NULL} 부분)을 함께 사용할 수 없습니다.

+0

Blagovest Buyukliev에 감사드립니다. – DrDee

2

const 키워드로 num_fields를 정의하더라도 컴파일러는이를 변수로만 해석합니다. 는 다음 매크로를 정의하여 이에 대한 대안을 가질 수

#DEFINE num_fields 14

문자 필드 * [num_fields] = {} NULL;

0

귀하의 구성은 C++에서 작동합니다. 여기서 const int는 컴파일 타임 상수 ("상수 표현식")로 취급되며, 따라서 컴파일 타임 배열 크기로 사용할 수 있습니다.

그러나 C에서, "num_fields"당신의 정의 (이 측면은 C++에 대한 B. 스트로브 스트 룹의 설계 목표 중 하나 인 컴파일 타임 매크로 가능한 경우에 대한 필요성을 제거 할 수 있었다)을 효과적으로 읽기 전용을 선언 메모리 위치를 사전 설정 값으로 유지하므로 C 규칙에 따라 컴파일시 유효한 "상수 표현"이 아니므로 가장 바깥 쪽 '프로그램'범위에서 배열 크기로 사용할 수 없습니다.

관련 문제