2013-01-27 3 views
4

I 런타임에서 결정된 길이를 갖는 배열이 일반적으로 어레이를 선언함으로써 가능하다는 것을 알고복합 리터럴이 c99에서 가변 길이를 가질 수있는 방법이 있습니까?

char buf[len]; 

하고 난 화합물 litral으로 배열을 선언하고 포인터의 중간에 할당 할 수 있음을 알고

char *buf; 
.... 
buf = (char[5]) {0}; 

그러나 두 가지를 결합해도 작동하지 않습니다 (표준에서는 허용되지 않습니다).

내 질문은 : 다음 코드의 효과를 얻을 수있는 방법이 있습니까? (len 참고)

char *buf; 
.... 
buf = (char[len]) {0}; 

감사합니다.

+0

왜'memset' 옵션이 아닌가요? –

+0

@AlexandreC. 첫 번째 코드 세그먼트 (복합 스택에 메모리를 동적으로 할당)가 복합 문자 표기법을 사용하여 수행하려고합니다. – seininn

+1

유효한 휴대용 C를 작성하는 데 신경 쓰지 않는다면,'alloca'를 사용할 수 있습니다 ... –

답변

7

언어는 명시 적 형명 객체 유형 또는 알 의 배열을 정한다이

6.5.2.5 화합물 리터럴을

제약

1 금지 크기는 가능하지만 가변 길이 배열 유형은 아닙니다.

이와 같이 필요한 경우 compund literal 대신 VLA 객체를 사용해야합니다. 그러나이

char buf[len] = { 0 }; // ERROR for non-constant `len` 

(I이 제한 뒤에있는 근거가 무엇인지 전혀 모른다.)

그래서, 추가로 사용하여 할 수없는 것을 의미 VLA 유형은 초기화를 허용하지 않는 점에 유의 명명 된 VLA 객체 인 경우 memset 또는 명시적인 사이클처럼 0을 출력 할 수있는 방법이 필요합니다.

+0

빠른 응답 (그리고 const. edits;)을 주셔서 감사합니다). 그러나 표준에서 금지하고 있음을 알고 있습니다. 내 코드를 임시 변수로 처리하지 않으려 고 노력 중이며 복합 리터럴만큼 편리한 구문이 필요합니다. – seininn

+3

VLA가 있기 때문에 다양한 복합 리터럴이 기술적으로 가능해야하기 때문에 부끄러운 생각입니다. 잘만되면 다음 표준. – seininn

+0

@seininn. 임시 직원에 대한 귀하의 사용에 동의합니다. 나는이 사용을위한 이상적인 구조가 복합 문자의 첫 부분 일 것이라고 생각한다. 우리가 필요로하는 것은 공간이고 가변 길이 배열을 자동 초기화하는 것은 아마도 제한된 유틸리티 일 것입니다. 왜냐하면 빈 초기화 자로 간단히 (float [n]) {} 만하면됩니다. 그것은 gcc {} 확장과 충돌하지만, 0 init은 끔찍한 협상이 될 수 없습니다. –