2017-03-25 9 views
0
'    int main() 
       { 
        int *ptr = (int*)calloc(10,sizeof(int));//allocating memory for 10 integers 
        ptr = realloc(ptr,20*sizeof(int)); //reallocating the memory for 20 integers 
        free(ptr); 
        return 0; 
      }' 

초기에는 ptr 보류 메모리에 0이 들어 있지만 새로 생성 된 메모리에는 0 또는 쓰레기 값이 들어 있습니다. 내가 calloc 포인터를 재 할당하면 결과는 어떻게됩니까?

제로는 realloc 함수 수있는 방법을 제시하는 경우

는 malloc에 ​​또는은 calloc을 사용하여 생성 된 PTR 날씨 알고있다.

ptr = realloc(ptr,20*sizeof(int)); 

을 (일부는이 같은 안전하지 말할 수는 (결과를 캐스팅하고 다시 할당하지 않거나 제대로 작동하지 않습니다) 제대로처럼 realloc라고해도

+0

코드가 올바르지 않습니다. 'realloc'의 맨 페이지를 읽으십시오 (여러분의 질문에도 답할 것입니다). 혼자서도 최소한의 노력이 필요합니다. – Olaf

+0

아, 이제이 말이 맞습니다. 내 대답을 업데이트 할 때 :) –

+0

나는 따라하기가 힘듭니다. 그러나 OP가 실제로 오타를 개선하기 때문에, 나는 기꺼이 그것을한다. –

답변

3

reallocNULL을 반환 할 수 있으므로 ptr에 대한 참조를 잃을 수 있습니다.

그렇지 않습니다. 그냥 수동 예를 들어 memset를 사용하여 0으로 메모리의 나머지 부분을 설정해야

0에 나머지를 설정없이 재 할당합니다.

나는 할 것이다 :

int *ptr_new = realloc(ptr,20*sizeof(int)); 
if (ptr_new == NULL) { /* print error, free(ptr) and exit: no more memory */ } 
else 
{ 
    // set the end of memory to 0 
    memset(ptr_new+10,0,sizeof(int)*10); 
    ... 

참고 : 일반적인 실수는 OS가 다른 메모리를 이동해야하는 지점까지 작동하는 것 같다 때문에하지realloc의 결과를 다시 할당입니다 그 경우 귀하의 ptr 포인터가 유효하지 않게되고 정의되지 않은 동작이 발생합니다.

+0

이전에 포인터에 있던 데이터를 "realloc"하지 않을 것입니다. 이 경우 0은 이전과 동일하게 유지됩니다. –

+1

하지만 ptr에 일부 데이터가 포함되어있는 경우 realloc을 실행하면 realloc이 새 위치의 데이터를 복사합니다. –

+1

예, 이전에 할당 된 메모리 크기보다 높지는 않지만 지속됩니다. –