2012-06-28 4 views
2

최근에 나는 C 언어로 배열을 다루는 것이 짜증이났다.
크기를 늘리려면 realloc()을 자주 사용해야합니다.
그리고 리눅스 커널 것으로 알려져을 가지고

자바 표준 데이터 C 벡터와 같은 구조 ++ 또는 ArrayList를이없는 일부 데이터 구조 등
kfifo, )는 (우리가 kfifo_in하여 사용할 수있다 , kfifo_out() 함수.

그러나 이것은 사용자가 kfifo * pointer를 정의한다는 것을 의미합니다. 이 변수는 구조체에 포함 된 유형에 대한 정보를 포함하지 않습니다.
사용자는 kfifo 포인터로 동적 배열을 사용하려고 할 때이를 기억해야합니다.
조금 혼란 스러울 수도 있습니다.
문제를 해결할 더 좋은 방법이 있습니까? 리눅스 C 프로그래밍의 일반적인 솔루션은 무엇입니까?C의 동적 배열

답변

3

realloc 코드 전체에 퍼뜨리지 않는 한 그다지 좋지 않으며 합리적인 전략을 사용하여 동적 배열을 확장하십시오.

C로 동적 배열을 롤링하는 것은 몇 가지 쉬운 기능을 구현하는 데 있습니다. 수많은 짧은 기사가이 운동을 안내합니다 (예 : here is one). 이 기사에서는 동적 배열을 나타내는 struct을 현재 사용되는 크기와 할당 된 크기와 함께 정의합니다. 또한 구조체가 나타내는 배열을 초기화, 확장 및 할당 해제하기위한 함수도 제공합니다. 라이브러리에는 명시 적 초기화 함수가 없습니다. NULL을 첫 번째 매개 변수로 전달하여 초기화합니다. 이것은 유효한 접근 방법이지만 initgrow의 전통적인 구분을 선택할 수도 있습니다.

+0

의견을 보내 주셔서 감사합니다. 나는 이것을 할 계획이다. 조금 이상하다. 사용자는이 동적 배열을 사용할 때 요소 유형을 기억해야한다. 그건 그렇고, 당신이 언급 한 예제는 요소를 저장하기 위해 void * pointer를 사용하는 것 같다. 나는 그것이 약간 위험하다고 생각한다. void * 객체가 도달 범위를 벗어난 경우 어떻게해야합니까? 메모리를 복사하는 것이 더 안전 할 수도 있습니다. – bluesea

+0

@bluesea 그들은 사용자가 원할 수있는 모든 유형에 대해 코드를 재사용 할 수 있도록 특정 유형보다는'void *'를 사용합니다. 이는 C++ 템플릿과 같은 일반적인 프로그래밍을위한 C 부족한 결과로 인한 불행한 결과입니다. – dasblinkenlight

+0

그들은 구조체 array {int len; int 용량; int each_element_size; void * data;} 그리고 데이터의 끝 부분에 놓인 요소의 바이트를 복사합니다. – bluesea

2

Glib arrays을 사용하고 싶습니다. Gnome과 같은 프로젝트에서 사용되는 Linux 및 기타 OSes에서 매우 잘 알려진 라이브러리입니다. C에서 동적 배열에 대한 표준이 없습니다

+0

많은 프로젝트, 심지어 그놈이 그것을 사용한다면, Glib은 유용 할 것으로 보인다. 감사! – bluesea

0

@bluesea

나는 그들이 구조체 배열을 정의 할 수 있습니다 의미 {INT 렌; int 용량; int each_element_size; void * data;} 그리고 데이터의 끝 부분에 놓인 요소의 바이트를 복사합니다. - bluesea Jun 29 at 3:04에

이것은 이미 토론중인 라이브러리에서 처리됩니다. main.c 파일의 매크로와 예제를 참조하십시오. 사용되는 매크로에 따라 원본 데이터에 대한 포인터 배열 또는 데이터 복사본에 대한 포인터 배열로 끝날 수 있습니다.

FWIW, 저는 도서관의 저자이며, 에어백이 없다는 것을 처음으로 인정할 것입니다. 따라서 C에서 다른 것과 마찬가지로 안전하게 사용해야합니다.