2010-07-20 5 views
2

표준 specifies 새 크기가 더 큰 경우 재 할당 공간의 내용이 정의되지 않았 음을 나타냅니다.배열 재 할당 (C99)

이전에 할당 된 공간의 내용을 보존하는 것이 중요한 경우 데이터를 다음과 같이 재 할당하는 것이 가장 좋습니다. 스택에 복사하여 힙에서 해제하고 힙에 더 많은 공간을 할당 한 다음 다시 복사합니다. 힙에? 이 일을하는 또 다른 안전한 방법이 있습니까?

동적으로 증가하는 배열과 같이 확장 된 데이터 구조를 구현하는 가장 좋은 방법은 연결된 목록 형태로만 확장 할 수 있습니까?

답변

5

"새로 할당 된 객체 부분"의 내용이 지정되지 않았습니다. 콘텐츠는 여전히 반환 된 메모리 영역의 시작 부분에 있습니다.

내가 할 말 : p에서

char *p = malloc(6); 
if(p == NULL) { ... } 
memcpy(p, "Hello", 6); 
char *temp = realloc(p, 12); 
if(temp == NULL) { ... } 
p = temp; 

첫 번째 6 자이 'H', 'E', 'L', 'L'을, 'O', '\ 0'을 보장받을 수 있습니다, 여부와 관계없이 새 p은 이전 p과 동일합니다. 나머지 6 개의 "새로운"문자는 모두 정의되지 않았습니다.

2

메모리의 새 부분 만 정의되지 않습니다. 예를 들어, 10 개의 요소로 구성된 배열이 있고 20 개의 요소에 대해 충분한 크기로 재 할당하면 마지막 10 개의 요소는 정의되지 않습니다.

3

페이지를 읽는 중입니다. 그것은 다음과 같이 말합니다 : "물체의 내용물은 새롭거나 오래된 크기의 작은 것까지 변함없이 남아있을 것입니다."

해킹이 필요하지 않습니다. 단지 realloc()입니다.

4

"표준은 새 크기가 큰 경우 재 할당 공간의 내용이 정의되지 않았 음을 지정합니다."

아니요. 그것은 말한다 :

"내용의 내용은 새롭고 오래된 것의 더 작은 것까지 변하지 않게 남아있을 것이다." "새 크기가 더 크면 새로 할당 된 부분의 내용이 지정되지 않습니다."

새 부품의 내용 만 지정되지 않았습니다. realloc 후에 아무것도 손실되지 않습니다.