C에서 약간의 프로그램을 만들고 있는데 Vector/ArrayList/LinkedList를 필요로하지만 C와 함께 작업하고 있습니다. 그런 종류의 작업을 수행 할 수있는 방법에 대한 아이디어 C?C Vector/ArrayList/LinkedList
구조체를 저장 한 다음 일부를 추가/제거하고 싶습니다.
C에서 약간의 프로그램을 만들고 있는데 Vector/ArrayList/LinkedList를 필요로하지만 C와 함께 작업하고 있습니다. 그런 종류의 작업을 수행 할 수있는 방법에 대한 아이디어 C?C Vector/ArrayList/LinkedList
구조체를 저장 한 다음 일부를 추가/제거하고 싶습니다.
크기 조정 가능한 배열의 경우 malloc()
및 realloc()
을 사용할 수 있습니다. 이를 통해 힙에 특정 공간을 예약 (malloc()
)하고 크기를 조정할 수 있습니다 (realloc()
). 그들은이 방법을 사용하고 있습니다 :
int* a = malloc(10 * sizeof(int));
if(a == NULL) {} // malloc() was unable to allocate the memory, handle the
// error and DO NOT use this pointer anymore
// now you can treat a as a normal array of 10 ints:
a[4] = 51;
// suppose 10 ints aren't no more enough:
a = realloc(a, 20 * sizeof(int));
if(a == NULL) {} // same thing as before
// here you have 20 ints, the previous 10 are still there
a[18] = a[4]
// don't forget to free the memory when you have finished:
free(a);
은 그냥 구조체 유형 'INT'을 대체합니다. ;)
질문에 "C"태그 만 붙어 있기 때문에 오류보다 더 해를 끼치는 불필요한 (예를 들어 추악한!) 캐스트를 예제에 채워야하는지 여부는 의심 스럽습니다. 'void *'로의 캐스팅은 논란의 여지도 있지만 절대로 좋은 연습은 아닙니다! 또한 예외 처리가 중요하기 때문에 오류 처리가 중요하므로'malloc'과'realloc'의 반환 값을 확인해야합니다 (원래 포인터를 잃지 말아야합니다!) 또한'realloc '을 호출해도 거의 모든 컴퓨터의 버퍼 크기 (20 바이트는 ** 매우 ** 거의 10 개 이상의 int)입니다. –
또한이 유형을 다른 유형과 함께 사용하려면 캐스트 이상을 변경해야합니다. 그러나 더 나은 스타일 (예 :'type * ptr = malloc (N * sizeof * ptr)'및'realloc'과 유사하게)을 따르면 선언에서'type' 유형을 변경해야합니다. –
무료() – BatchyX
C는 C++ 및 Java와 같은 높은 수준의 언어와는 달리 표준 수집의 어떤 형태 (제공되지 않음) 그래서 당신은 몇 가지 옵션으로 남겨 :
당신은 정확하게 당신이 사용하는 어떤 결정하기 위해이 프로그램에 필요한 고려해야합니다. 당신이 원하는 것은 아마도 두 가지 옵션 중 하나를 찾고있을 것입니다 :
두 가지 종류의 데이터 구조 간의 절충에 대한 자세한 내용은 Wikipedia 페이지를 참조하십시오.
@Conrad Meyer의 답변을 사용했습니다. 최신 Glib 라이브러리를 here에서 다운로드하여 this 매뉴얼을 사용하여 편집합니다. Glib 라이브러리를 테스트하기 위해서 나는 this 테스트를 사용했다. 테스트 코드를 컴파일하는 동안 오류가 발생할 수 있습니다. This을 사용하면 문제를 해결하는 데 도움이됩니다.
또한 테스트 코드에 어떤 종류의 메모리 누수가 있음을 발견했습니다.Valgrind의 결과는 원래의 코드를 실행 :
#include <stdio.h>
#include <glib.h>
int main(int argc, char** argv) {
GList* list = NULL;
list = g_list_append(list, "Hello world!");
printf("The first item is '%s'\n", (char *)g_list_first(list)->data);
g_list_free(list);
return 0;
}
Valgrind의 새로운 결과 :
==20350== HEAP SUMMARY:
==20350== in use at exit: 4,632 bytes in 12 blocks
==20350== total heap usage: 12 allocs, 0 frees, 4,632 bytes allocated
==20350==
==20350== LEAK SUMMARY:
==20350== definitely lost: 0 bytes in 0 blocks
==20350== indirectly lost: 0 bytes in 0 blocks
==20350== possibly lost: 992 bytes in 4 blocks
==20350== still reachable: 3,640 bytes in 8 blocks
==20350== suppressed: 0 bytes in 0 blocks
그래서 나는 코드 한 줄을 삽입
==20310== HEAP SUMMARY:
==20310== in use at exit: 4,632 bytes in 12 blocks
==20310== total heap usage: 12 allocs, 0 frees, 4,632 bytes allocated
==20310==
==20310== LEAK SUMMARY:
==20310== definitely lost: 0 bytes in 0 blocks
==20310== indirectly lost: 0 bytes in 0 blocks
==20310== possibly lost: 0 bytes in 0 blocks
==20310== still reachable: 4,632 bytes in 12 blocks
==20310== suppressed: 0 bytes in 0 blocks
This 대답은 이야기가있다 still reachable
메모리에 대해 걱정할 필요가 없습니다.
표준 C 라이브러리에는 그런 것이 없습니다. 사람들은 대개 자신의 역할을합니다. – Thomas
벡터 및 ArrayList라는 용어는 일반적으로 동일한 데이터 구조 (크기 조정 가능한 배열)를 참조하지만 링크 된 목록은 완전히 다른 것입니다. 그래서 크기를 조정할 수있는 배열이나 링크 된 목록을 원하십니까? – sepp2k
그리고 사람들은해서는 안됩니다. Glib은 http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html에서 매우 훌륭한 구현을 가지고 있습니다. 그리고 대부분의 유닉스 C 라이브러리에는 tsearch의 구현이 포함되어 있습니다. , 요소 목록으로 서비스 될 수 있습니다. –