재할당이 이전 내용을 덮어쓰나요?
메모리를 재할당할 때realloc()
이전 내용을 덮어쓰셨습니까?데이터를 입력할 때마다 메모리를 재할당하는 프로그램을 만들려고 합니다.
재할당을 통한 메모리 할당에 대해 알려주세요, 예를 들어 컴파일러에 종속되어 있습니까?
오래된 내용에 대해서는 걱정하지 마세요.
올바른 사용 방법realloc
재할당을 위해 특정 포인터를 사용하고, 해당 포인터를 테스트한 다음, 모든 것이 정상이면 이전 포인터를 변경합니다.
int *oldpointer = malloc(100);
/* ... */
int *newpointer = realloc(oldpointer, 1000);
if (newpointer == NULL) {
/* problems!!!! */
/* tell the user to stop playing DOOM and retry */
/* or free(oldpointer) and abort, or whatever */
} else {
/* everything ok */
/* `newpointer` now points to a new memory block with the contents of oldpointer */
/* `oldpointer` points to an invalid address */
oldpointer = newpointer;
/* oldpointer points to the correct address */
/* the contents at oldpointer have been copied while realloc did its thing */
/* if the new size is smaller than the old size, some data was lost */
}
/* ... */
/* don't forget to `free(oldpointer);` at some time */
기존 콘텐츠를 덮어쓰지 않고 이미 할당된 메모리를 늘리거나, 확장할 수 없는 경우에는 다른 위치에 더 큰 새 메모리를 할당하고 이전 메모리의 기존 콘텐츠를 새 메모리로 복사합니다.
이전 포인터를 덮어쓰는 것처럼 프로그래밍해야 합니다.이전 메모리는 더 이상 할당되지 않으므로 프로그램의 다른 부분(예: 시스템 스레드)에 의해 재할당되고 재할당을 호출한 후 언제든지 덮어쓸 수 있습니다.
새 메모리에는 항상 이전 메모리에 있던 데이터와 동일한 데이터가 포함되지만(필요한 경우 복사됨), 이전 블록 크기까지만 마지막에 할당된 추가 공간이 초기화되지 않습니다.
만약 당신이 복사본을 원한다면, 새로운 malloc를 하고 memcpy를 사용하세요.
구현 측면에서 크기를 늘리기 위해 재할당을 호출하면 다음 중 하나가 발생할 수 있습니다.
- 새 블록이 할당되고 이전 메모리의 내용이 복사되고, 이전 블록이 해제되고, 새 포인터가 반환됩니다.
- 블록 다음 영역이 할당되지 않으면 기존 블록이 확장되어 동일한 포인터가 반환될 수 있습니다.
어떤 일이 일어났는지 알 수 있는 방법이 없거나 위에서 제안한 것과 완전히 다른 구현체가 사용되더라도 항상 재할당 사양에 따라 코드화해야 합니다. 즉, 이전 포인터를 더 이상 사용해서는 안 되며 새 포인터를 사용해야 합니다.
무엇을 묻는 것인지 분간하기 어렵지만, 전달된 구 주소에서 '구 내용'을 읽을 수 있는지 묻는 것이라면.realloc
대답은 아니오입니다.경우에 따라, 당신은 그 곳에서 오래된 내용의 일부 또는 전부를 찾을 수 있지만, 그렇지 않은 경우.realloc
전달한 것과 동일한 포인터를 반환했습니다. 이전 포인터를 사용하면 정의되지 않은 동작입니다.
이전 내용이 반환된 새 주소에 보존될 것인지 여부를 묻는 것일 뿐입니다.realloc
정답은 "예"입니다(이전 크기와 새 크기의 최소 크기까지).
언급URL : https://stackoverflow.com/questions/3850749/does-realloc-overwrite-old-contents
'programing' 카테고리의 다른 글
C 프로그램에는 main()이 필요합니까? (0) | 2023.06.15 |
---|---|
리눅스에서 프로그램 성능을 측정하는 고해상도 타이머를 만드는 방법은 무엇입니까? (0) | 2023.06.15 |
화이트리스트에 있는 링크에 대해 Firebase에서 "도메인이 화이트리스트에 없음"으로 표시됨 (0) | 2023.06.10 |
Scikit 학습의 랜덤 상태(의사 난수) (0) | 2023.06.10 |
모듈을 찾을 수 없음: 오류:'C:\dev\jszip-test\node_modules\jszip\lib'에서 '스트림'을(를) 확인할 수 없습니다. (0) | 2023.06.10 |