최근에 나는 C 언어로 배열을 다루는 것이 짜증이났다.
크기를 늘리려면 realloc()을 자주 사용해야합니다.
그리고 리눅스 커널 것으로 알려져을 가지고
자바 표준 데이터 C 벡터와 같은 구조 ++ 또는 ArrayList를이없는 일부 데이터 구조 등
kfifo, )는 (우리가 kfifo_in하여 사용할 수있다 , kfifo_out() 함수.
그러나 이것은 사용자가 kfifo * pointer를 정의한다는 것을 의미합니다. 이 변수는 구조체에 포함 된 유형에 대한 정보를 포함하지 않습니다.
사용자는 kfifo 포인터로 동적 배열을 사용하려고 할 때이를 기억해야합니다.
조금 혼란 스러울 수도 있습니다.
문제를 해결할 더 좋은 방법이 있습니까? 리눅스 C 프로그래밍의 일반적인 솔루션은 무엇입니까?C의 동적 배열
C의 동적 배열
답변
realloc
코드 전체에 퍼뜨리지 않는 한 그다지 좋지 않으며 합리적인 전략을 사용하여 동적 배열을 확장하십시오.
C로 동적 배열을 롤링하는 것은 몇 가지 쉬운 기능을 구현하는 데 있습니다. 수많은 짧은 기사가이 운동을 안내합니다 (예 : here is one). 이 기사에서는 동적 배열을 나타내는 struct
을 현재 사용되는 크기와 할당 된 크기와 함께 정의합니다. 또한 구조체가 나타내는 배열을 초기화, 확장 및 할당 해제하기위한 함수도 제공합니다. 라이브러리에는 명시 적 초기화 함수가 없습니다. NULL
을 첫 번째 매개 변수로 전달하여 초기화합니다. 이것은 유효한 접근 방법이지만 init
과 grow
의 전통적인 구분을 선택할 수도 있습니다.
Glib arrays을 사용하고 싶습니다. Gnome과 같은 프로젝트에서 사용되는 Linux 및 기타 OSes에서 매우 잘 알려진 라이브러리입니다. C에서 동적 배열에 대한 표준이 없습니다
많은 프로젝트, 심지어 그놈이 그것을 사용한다면, Glib은 유용 할 것으로 보인다. 감사! – bluesea
@bluesea
나는 그들이 구조체 배열을 정의 할 수 있습니다 의미 {INT 렌; int 용량; int each_element_size; void * data;} 그리고 데이터의 끝 부분에 놓인 요소의 바이트를 복사합니다. - bluesea Jun 29 at 3:04에
이것은 이미 토론중인 라이브러리에서 처리됩니다. main.c 파일의 매크로와 예제를 참조하십시오. 사용되는 매크로에 따라 원본 데이터에 대한 포인터 배열 또는 데이터 복사본에 대한 포인터 배열로 끝날 수 있습니다.
FWIW, 저는 도서관의 저자이며, 에어백이 없다는 것을 처음으로 인정할 것입니다. 따라서 C에서 다른 것과 마찬가지로 안전하게 사용해야합니다.
- 1. C의 동적 2D 배열 할당
- 2. C의 "동적 비트 필드"
- 3. C의 문자 배열
- 4. Object C의 2D 배열
- 5. 객관적인 C의 플로트 배열
- 6. 목표 C의 배열 길이
- 7. C의 문자열 배열
- 8. C의 배열 초기화
- 9. objective-c의 포인터 배열
- 10. 는 C의 이차원 동적 배열 알고리즘 ++의 기간을 단축
- 11. C의 동적 배열 - malloc/realloc에 대한 제 이해가 정확합니까?
- 12. time_t 오브젝트를 주문하기위한 C의 동적 데이터 구조?
- 13. 동적 배열, 동적 생성자
- 14. 동적 구조 내부의 동적 배열 배열
- 15. 동적 메모리와 C의 상속 구조체 ++
- 16. Objective-C/C의 배열 이해
- 17. C의 배열 최대 크기는 얼마입니까?
- 18. Objective-C의 가변 크기 배열?
- 19. c의 txt 배열 (긴 숫자)
- 20. C의 구조체 값에 배열 할당
- 21. objective-c의 다차원 배열 반복
- 22. 복사 C의 문자열 배열 오류
- 23. C의 하드 코드 바이트 배열
- 24. C 동적 배열 문제
- 25. 동적 배열 너비?
- 26. 동적 ListSelector 배열 문제
- 27. 어셈블리에서 동적 배열 만들기
- 28. JQuery와 배열 동적 초기화
- 29. 동적 2 차원 배열
- 30. 동적 인 배열 키
의견을 보내 주셔서 감사합니다. 나는 이것을 할 계획이다. 조금 이상하다. 사용자는이 동적 배열을 사용할 때 요소 유형을 기억해야한다. 그건 그렇고, 당신이 언급 한 예제는 요소를 저장하기 위해 void * pointer를 사용하는 것 같다. 나는 그것이 약간 위험하다고 생각한다. void * 객체가 도달 범위를 벗어난 경우 어떻게해야합니까? 메모리를 복사하는 것이 더 안전 할 수도 있습니다. – bluesea
@bluesea 그들은 사용자가 원할 수있는 모든 유형에 대해 코드를 재사용 할 수 있도록 특정 유형보다는'void *'를 사용합니다. 이는 C++ 템플릿과 같은 일반적인 프로그래밍을위한 C 부족한 결과로 인한 불행한 결과입니다. – dasblinkenlight
그들은 구조체 array {int len; int 용량; int each_element_size; void * data;} 그리고 데이터의 끝 부분에 놓인 요소의 바이트를 복사합니다. – bluesea