문제

여기에 스 니펫이 있습니다 공식 애플 문서 AudioBufferList (핵심 오디오 데이터 유형 참조):

AudioBufferList
AudioBuffer 구조의 가변 길이 배열을 보유합니다.

struct AudioBufferList {
    UInt32      mNumberBuffers;
    AudioBuffer mBuffers[1];
};
typedef struct AudioBufferList  AudioBufferList;

필드

mNumberBuffers
Mbuffers 어레이의 AudioBuffer 구조의 수.

mBuffers
AudioBuffer 구조의 가변 길이 배열.

만약에 mBuffers 정의됩니다 AudioBuffer[1] 길이가 변하지 않으므로 mNumberBuffers 암시 적으로 정의됩니다 1.

나는 여기서 뭔가를 그리워합니까, 아니면 이건 말도 안되는가?

도움이 되었습니까?

해결책

C99 이전의 C에는 0이 아닌 일정한 배열 크기가 필요하기 때문입니다.

그리고 mBuffers 선언 할 수 없습니다 AudioBuffer*, 목록이 안에 들어 있기 때문입니다.

그리고 mBuffers 선언 할 수 없습니다 AudioBuffer, 때문에 mBuffers[x] 구문이 필요합니다.

그래서 AudioBuffer[1] 사용.

해당 구조가 C99를 위해 작성된 경우 선언은 다음과 같습니다.

struct AudioBufferList {
    UInt32      mNumberBuffers;
    AudioBuffer mBuffers[];
};

(또한보십시오 C가 나쁜 연습에서 유연한 배열 멤버를 사용하고 있습니까?.)

다른 팁

"구조체 해킹"또는 (C99에서) "가변 길이 배열"(VLA)이라고 불리는 것입니다. 기본 아이디어는 '1'이 단지 장소 보유자라는 것입니다. 이 구조를 사용하면 동적으로 할당하여 실제 데이터를위한 충분한 공간을 할당합니다. 예를 들어, 10 개의 버퍼를 원한다면 공간을 다음과 같은 공간을 할당합니다.

AudioBufferList *a = malloc(sizeof (*a) + 9 * sizeof(AudioBuffer));
a->mNumberBuffers = 10;

구조물 자체의 일부로 하나의 AudioBuffer 공간을 할당하므로 할당에 추가 할 공간을 가져 가려는 숫자에서 하나를 빼냅니다.

이 기술은 PostgreSQL에서도 본 것입니다. 항상 댓글이 표시되어 있습니다.

// VARIABLE SIZED STRUCTURE

또는 그런 것. 기본적으로 작동 방식은 구조물 사용자가 Mbuffers의 크기 1이 단순히 초기 크기임을 이해할 것으로 예상된다는 것입니다. 구조의 크기를 조정하기 위해, 그들은 모든 것을 Realloc ()로, 끝에있는 메모리가 Mbuffers 목록에 "속한다"고 가정합니다.

내가 말한 바에 따르면 mBuffers[1] 비트는 단지 오래된 C 트릭입니다. 이를 통해 구조의 멤버는 가변 길이 배열이 될 수 있습니다. 구조물의 크기를 지나서 쓸 때 구조물의 마지막 요소 여야한다는 것을 알아야합니다.

이것은 올바르게 할당해야합니다. 또는 많은 강아지가 죽을 것입니다 ..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top