2013-07-27 3 views
1

제가C, 난 일부 공정을 수행하고 마지막 I 더 이상 제 10 개 요소를 필요로하지 않는

double *array; 
array=malloc(100*sizeof(double)); 

가진 배열을위한 공간을 할당 한 가정 처음부터 할당 된 공간을 축소, I는 realloc 이것을 시도 :

*** glibc detected *** ./temp: realloc(): invalid pointer:... 

가 어떻게 쉬 수 있습니다

array=realloc(array+10, 90*sizeof(double)); 

하지만 잘못된 포인터 오류가 배열을 처음부터 사자?

+0

나는 그렇게 생각하지 않는다. 옵션은 활성 요소를 처음으로 이동시킨 다음 끝에 다시 할당하는 것입니다. 또는 어떤 종류의 활성 구조 (예 : 연결된 목록)를 사용하십시오. – Jiminion

+0

감사합니다. Grijesh Chauhan 및 H2CO3, 이해했습니다! "Realloc은 배열로 사용되는 메모리에 'ptr'포인트가 필요하지 않지만 실제로는 일반적으로 그렇게합니다." 나는 이것을 내가 생각한 것을 할 수있는 자유로 해석했다. 이제 나는 할 수 없다는 것을 이해합니다! 고맙습니다. – makhlaghi

답변

3

먼저 배열을 으로 줄이기 위해 배열을 재 할당하는 것은 좋은 생각이 아닙니다. 많은 시간을 할애하면 잠재적으로 메모리 조각화로 이어질 수 있습니다. 필요한 경우 배열을 realloc() ~ 까지 확장하십시오. (이 두 과정의 분열을 방지하지 않습니다,하지만 당신은 realloc() 이하를 사용하는 경우, 그 도움이됩니다.)


말했다 즉, 여전히 배열을 축소하려는 경우 : 당신이 읽고있는 the documentation (로 이 질문을하기 전에 amirite?)라고 말하면 malloc()에 의해 반환 된 포인터에 realloc()을 호출해야합니다. 그 포인터에 10을 더한 것이 아니라, 그 포인터 시간이 아니라 오일러의 상수가 아니라 그 포인터가 현재 달의 일 수를 뺀 것이고, 그 외에는 단지 같은 포인터입니다.

먼저 요소를 이동 한 다음 배열을 다시 할당해야합니다. 그러나이 같은 임시 버퍼에 요소를 복사 포함 :

double *tmp = malloc(90 * sizeof(*tmp)); 
memcpy(tmp, array, 90 * sizeof(*tmp)); 

double *guard = realloc(array, 90 * sizeof(*array)); 
if (!guard) { 
    // realloc() failed 
    abort(); // whatever 
} 

array = guard; 
memcpy(array, tmp, 90 * sizeof(*tmp)); 

그래서이 모든 좋은 것은 아닙니다, 그럴 수있어 그 내용을 복사하고 array에 새로 얻은 포인터를 할당 한 후 바로 free() 기존의 배열입니다.

+1

그리고, 완전성을 위해 [The (최신판) 문서] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/realloc.html). –

1

읽기 : void* realloc (void* ptr, size_t size); :

Reallocate memory block

Changes the size of the memory block pointed to by ptr.

The function may move the memory block to a new location (whose address is returned by the function).

The content of the memory block is preserved up to the lesser of the new and old sizes, even if the block is moved to a new location. If the new size is larger, the value of the newly allocated portion is indeterminate.

Parameters:
ptr
Pointer to a memory block previously allocated with malloc , calloc or realloc . Alternatively, this can be a null pointer, in which case a new block is allocated (as if malloc was called).

아니 당신이 realloc

그래서 당신은 무엇을 할 수 있는지 처음 10을 제거입니다 malloc()/calloc() 기능

에 의해 반환되는 수신인이 필요 같은 요소를 재 할당 할 수 없습니다 배열에서 숫자를 가져온 다음 reallocate를 호출하십시오.

많은 구현에서 realloc()을 통한 축소 조치 호출은 힙에서 예약 된 크기를 변경하고 메모리를 이동시키지 않습니다. (그렇지만 메모리 관리가 조각 영역을 채우기 위해 이동할 수 있음).

+0

두 가지 이유로 cplusplus.com에 대한 링크를 게시하지 마십시오. 1.우리는 C++가 아니라 C에 대해 이야기하고 있습니다. 2. cplusplus.com은 끔찍한 사이트이며 모든 종류의 부정확성을 포함합니다. C 질문에 대해서는 Open Group의 공식 문서에 링크하고 C++의 경우 아마도 en.cppreference.com이 더 좋습니다. –

+0

@ H2CO3 예? 감사 정확한 제안. 그러나 대부분의 시간에 나는 그것이 매우 도움이된다는 것을 알았다. –

+0

@Ggijesh 예, 포괄적이고 도움이되는 것처럼 보일 수 있지만 불행히도 종종 잘못되었습니다. [링크.] (http://stackoverflow.com/questions/11972076/why-is-the-cplusplus-website-bad) –