C에서 배열은 일반적으로 크기 0을 가질 수 없습니다 (하나 또는 다른 컴파일러 측 확장을 사용하지 않는 한).
OTOH, 길이가 0으로 판명 될 수있는 VLA가 있습니다.
허용됩니까?
다음 코드에 대해 이야기하고 있습니다.
void send_stuff()
{
char data[4 * !!flag1 + 2 * !!flag2];
uint8_t cursor = 0;
if (flag1) {
// fill 4 bytes of data into &data[cursor]
cursor += 4;
}
if (flag2) {
// fill 2 bytes of data into &data[cursor]
cursor += 2;
}
}
결과는 data
플래그 조합에 따라 길이가 0, 2, 4 또는 6 인 배열입니다.
문제는 이제 배열의 길이가 0 인 경우에 유효한 코드입니까?
우리는에 갈 경우에 유효하지 않은 초안 C99 표준 섹션 6.7.5.2
배열 선언자 제 5 (라고 강조 광산 ) :
크기가 정수 상수 표현식이 아닌 표현식 인 경우 : 함수 프로토 타입 범위의 선언에서 발생하면 *로 대체 된 것처럼 처리됩니다. 그렇지 않으면 평가 될 때마다 0보다 큰 값을 갖게됩니다 . [...]
실제로 플래그를 사용하여 정의되지 않은 동작에 clang
대해 새니 타이 저 를 활성화하면 -fsanitize=undefined
이 경우에 대한 런타임 경고가 생성 될 수 있습니다 .
런타임 오류 : 가변 길이 배열 경계가 양수가 아닌 값 0으로 평가됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다