>  기사  >  백엔드 개발  >  C에서 동적 크기를 사용하여 배열을 올바르게 선언하는 방법은 무엇입니까?

C에서 동적 크기를 사용하여 배열을 올바르게 선언하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-18 10:45:02585검색

How Can You Correctly Declare an Array with a Dynamic Size in C?

배열 크기가 가변적일 때 C에서 동적 배열 생성

다음 코드 조각을 고려하세요.

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를 어떻게 올바르게 선언할 수 있습니까?

문제: C의 가변 길이 배열

안타깝게도 siz를 사용하여 배열을 생성하는 간단한 방법은 없습니다. C의 가변 길이. 유연한 배열이라고도 하는 가변 길이 배열은 C 표준의 일부가 아닙니다. 결과적으로 위에 제시된 코드는 올바르게 컴파일되지 않습니다.

대체 솔루션

이 문제에 대한 여러 가지 대안 솔루션이 있으며 각각 장단점이 있습니다.

1. std::벡터

std::Vector는 동적 배열과 유사한 데이터 구조를 제공하는 C의 표준 라이브러리 컨테이너입니다. 필요에 따라 자동으로 메모리를 할당하고 재할당하므로 배열 크기를 수동으로 선언할 필요가 없습니다. 다음 코드는 이 시나리오에서 std::Vector를 사용하는 방법을 보여줍니다.

std::vector<char> Sbuf;

Sbuf.push_back(someChar);

2. new 연산자

또 다른 옵션은 new 연산자를 사용하여 배열에 메모리를 동적으로 할당하는 것입니다. 그러나 이 접근 방식에는 수동 메모리 관리가 필요하므로 메모리 누수의 위험이 증가합니다. 또한 일반적으로 동적 배열의 경우 직접 메모리 할당보다 std::Vector를 사용하는 것이 좋습니다.

char* Sbuf = new char[siz];

// ...

delete [] Sbuf;

3. 외부 라이브러리

GNU C 라이브러리(glibc)와 같은 특정 외부 라이브러리는 가변 길이 배열을 지원합니다. 그러나 이 기능은 비표준이며 모든 컴파일러 및 플랫폼에서 지원되지 않을 수 있습니다.

위 내용은 C에서 동적 크기를 사용하여 배열을 올바르게 선언하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.