2012-05-02 6 views
1

내 프로그램에서 다시 사용하려는 배열에 문제가 있습니다. 나는 크기를 동적으로 바꾸고 그것을 지울 필요가있다. 그러나 불행히도 크기 조정은 작동하지 않습니다.크기 조정 및 배열 지우기

uint8_t * readBuffer; // Create array pointer 

readBuffer = (uint8_t *) malloc(4); // Mem. alloc. 4bytes 
memset(readBuffer, 0, sizeof(readBuffer); // Reset array 
// Do stuff 
free(readBuffer) // Release mem. block 
.... 
readBuffer = (uint8_t *) malloc(1) // Mem. alloc. 1byte 
memset(readBuffer, 0, sizeof(readBuffer); // Reset array 
// Do stuff 
free(readBuffer) // Release mem. block 

크기 조정 단계에서 내 배열의 길이는 여전히 이전 (4)입니다.

나는 free을 잘못 사용하고 있습니까?

클리어링을위한 memset의 훨씬 더 효율적인 대안은 무엇입니까?

미리 감사드립니다.

+0

4라는 것을 어떻게 알 수 있습니까? 또한 'realloc'을 사용하지 않는 이유는 무엇입니까? – Pubby

+0

'sizeof (readBuffer) '로 확인한다. – JavaCake

+0

'sizeof (readBuffer)'는'malloc'에 의해 할당 된 메모리의 크기를 반환하지 않고 단지 포인터 값을 저장하는 데 필요한 바이트의 수를 반환한다. – Naveen

답변

5

포인터의 크기 (예 : readBuffer)는 모든 데이터 유형에 대해 항상 동일합니다 (여기서 4 바이트). 그래서 malloc(1) 이상적으로 1 바이트 의미 malloc()

uint size = 4; 
readBuffer = (uint8_t *) malloc(size); // Mem. alloc. 4bytes 
memset(readBuffer, 0, size); // Reset array 

또한 인수가 바이트에 : 당신은 오히려 임시로 malloc을 내부에 주어진 크기를 저장하고 memset()를 사용해야합니다. 당신은 C를 사용하는 경우 ++ 다음 new을 사용

readBuffer = new uint8_t[N]; // 'N' is number of elements of "uint8_t" 

편집 : 여기

std::vector<uint8_n> readBuffer(N, 0); 

당신이 'N'요소를 할당됩니다

C++에서

, std::vector 훨씬 쉽게이 기능을 제공합니다 readBuffer을 입력하고 0으로 초기화하십시오.
요소를 추가 할 때마다 push_back() 메서드를 사용할 수 있습니다.큰 덩어리의 경우 resize() 또는 reserve() 방법을 탐색 할 수도 있습니다.

+4

* "C++을 사용하고 new"*를 사용한다면'std :: vector '이라고 써야합니다. – Naveen

+0

@ Naveen, 동의 및 추가. – iammilind

+0

첫 번째 접근 방식이 작동합니다. 지금 사용 하겠지만 다음 버전은 std :: vector 일 수 있습니다. – JavaCake

1

크기 조정 단계에서 내 배열의 길이는 여전히 이전 (4)입니다.

문제는 sizeof(readBuffer)malloc()에 의해 할당 된 메모리의 양을 포인터의 크기를 반환하지 것입니다. 후자를 추적하려면 직접해야합니다.

나는 free을 잘못 사용하고 있습니까?

아니요, free()을 올바르게 사용하고 있습니다.

클리어링에 대한 memset의 훨씬 효율적인 대안은 무엇입니까?

나는 이 훨씬 더 더 효율적이라고 생각합니다. calloc()을 사용하여 시도 할 수 있습니다. 이는 malloc()과 같지만 메모리를 초기화합니다.

마지막으로 malloc()NULL을 반환했는지 확인하는 것이 좋습니다. 요청을 충족시킬만큼 메모리가 충분하지 않은 경우 수행 할 수 있습니다.

1
uint8_t * readBuffer; // Create array pointer 

readBuffer = (uint8_t *) malloc(4); // Mem. alloc. 4bytes 
memset(readBuffer, 0, sizeof(readBuffer); // Reset array 
// Do stuff 
free(readBuffer) // Release mem. block 
.... 
readBuffer = (uint8_t *) malloc(1) // Mem. alloc. 1byte 
memset(readBuffer, 0, sizeof(readBuffer); // Reset array 
// Do stuff 
free(readBuffer) // Release mem. block 

malloc의 캐스팅은 필요하지 않습니다. 또한 readBuffer에는 크기가 없으므로 sizeof (Uint8_t) * 4를 사용하십시오. 그러면 올바른 크기가됩니다.

그리고 malloc 대신 메모리 블록의 추출 포인터를 다시 할당해야하므로 realloc을 사용해야합니다. 이 값의 반환 값은 새 메모리 블록을 가리키며, 힙의 메모리를 사용할 수없는 경우 NULL입니다. 새 코드 :

uint8_t * readBuffer; // Create array pointer 

readBuffer = malloc(4); // Mem. alloc. 4bytes 
memset(readBuffer, 0, (sizeof(uint8_t) * 4)); // Reset array 
// Do stuff 
free(readBuffer) // Release mem. block 
.... 
uint8_t * temp = realloc(readBuffer, 1); // Mem. alloc. 1byte 
if(temp != NULL) readBuffer = temp; //Check if their was enough room to allocate memory 
memset(readBuffer, 0, (sizeof(uint8_t) * 4)); // Reset array 
// Do stuff 
free(readBuffer) // Release mem. block