다음 코드 조각을 고려하세요.
int siz = 0; int n = 0; FILE* picture; picture = fopen("test.jpg", "r"); fseek(picture, 0, SEEK_END); siz = ftell(picture); char Sbuf[siz]; fseek(picture, 0, SEEK_SET); //Going to the beginning of the file while (!feof(picture)) { n = fread(Sbuf, sizeof(char), siz, picture); /* ... do stuff with the buffer ... */ }
이 코드에서 우리는 다음을 목표로 합니다. "test.jpg" 파일의 크기를 읽고 해당 내용을 저장할 Sbuf 배열을 만듭니다. 그러나 Sbuf의 크기는 파일 크기에 따라 동적으로 결정됩니다. 이는 질문을 제기합니다: 코드가 성공적으로 컴파일되도록 siz를 어떻게 올바르게 선언할 수 있습니까?
안타깝게도 siz를 사용하여 배열을 생성하는 간단한 방법은 없습니다. C의 가변 길이. 유연한 배열이라고도 하는 가변 길이 배열은 C 표준의 일부가 아닙니다. 결과적으로 위에 제시된 코드는 올바르게 컴파일되지 않습니다.
이 문제에 대한 여러 가지 대안 솔루션이 있으며 각각 장단점이 있습니다.
std::Vector는 동적 배열과 유사한 데이터 구조를 제공하는 C의 표준 라이브러리 컨테이너입니다. 필요에 따라 자동으로 메모리를 할당하고 재할당하므로 배열 크기를 수동으로 선언할 필요가 없습니다. 다음 코드는 이 시나리오에서 std::Vector를 사용하는 방법을 보여줍니다.
std::vector<char> Sbuf; Sbuf.push_back(someChar);
또 다른 옵션은 new 연산자를 사용하여 배열에 메모리를 동적으로 할당하는 것입니다. 그러나 이 접근 방식에는 수동 메모리 관리가 필요하므로 메모리 누수의 위험이 증가합니다. 또한 일반적으로 동적 배열의 경우 직접 메모리 할당보다 std::Vector를 사용하는 것이 좋습니다.
char* Sbuf = new char[siz]; // ... delete [] Sbuf;
GNU C 라이브러리(glibc)와 같은 특정 외부 라이브러리는 가변 길이 배열을 지원합니다. 그러나 이 기능은 비표준이며 모든 컴파일러 및 플랫폼에서 지원되지 않을 수 있습니다.
위 내용은 C에서 동적 크기를 사용하여 배열을 올바르게 선언하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!