재할당 후 버퍼의 데이터가 손실됩니까?
재할당이 어떻게 작동하는지 이해하는 데 어려움을 겪고 있습니다.만약 내가 버퍼를 malloc하고 그 버퍼에 데이터를 복사했다면, "AB"라고 치자.
+------------+
| A | B | \0 |
+------------+
그런 다음 버퍼를 다시 할당했는데 데이터 손실이 발생합니까(단 한 바이트라도)?아니면 버퍼를 확장하는 것뿐인가요?:
+------------------------+
| A | B | \0 | ? | ? | ? |
+------------------------+
코드:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void){
char* buffer = (char*) malloc( sizeof(char) * 3 );
strncpy(buffer, "AB", 2);
buffer = (char*) realloc(buffer, sizeof(char) * 6); /* Will there be any lost here? */
free(buffer);
return(0);
}
A realloc
블록의 크기를 늘리면 원래 메모리 블록의 내용이 유지됩니다.메모리 블록의 크기를 조정할 수 없는 경우에도 이전 데이터는 새 블록으로 복사됩니다.당분간realloc
블록 크기가 감소하면 이전 데이터가 잘립니다.
다음으로 전화를 걸 때 주의하시기 바랍니다.realloc
어떤 이유로든 당신의 데이터를 잃는 것을 의미할 것입니다.realloc
실패합니다. 왜냐하면realloc
반환으로 실패함NULL
하지만 이 경우 원래 메모리 블록은 여전히 유효하지만 포인터를 덮어썼기 때문에 더 이상 액세스할 수 없습니다.NULL
.
표준 패턴은 다음과 같습니다.
newbuffer = realloc(buffer, newsize);
if (newbuffer == NULL)
{
//handle error
return ...
}
buffer = newbuffer;
또한 주조 공정에서 발생하는 수익률 값도 참고하십시오.malloc
C에서는 불필요하고 그것은sizeof(char)
정의에 따라 다음과 같습니다.1
.
아무것도 없어요.하지만 당신은 정말로 시험해봐야 합니다.realloc()
(및malloc()
전) "예전"
또한 malloc의 반환 값에 대한 캐스트는 기껏해야 중복되며 컴파일러가 없는 경우 발생할 수 있는 오류를 숨길 수 있습니다.
당신이 문자열을 원한다는 가정에 근거하여, 당신의 사용.strncpy
틀렸습니다
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char *buffer = malloc(3);
if (buffer == NULL) /* no memory */ exit(EXIT_FAILURE);
strncpy(buffer, "AB", 2);
/* ATTENTTION! ATTENTION: your array is not a string.
** buffer[2] is not the zero string terminator */
// buffer = realloc(buffer, 6); /* Will there be any lost here? */
/* If realloc returns NULL, you've just lost the only pointer to
** the allocalted memory, by overwriting it with NULL.
** Always `realloc` to a temporary variable */
char *tmp_buffer = realloc(buffer, 6);
if (tmp_buffer == NULL) {
/* realloc failed */
} else {
/* realloc worked, no bytes lost */
buffer = tmp_buffer;
/* ATTENTION! ATTENTION: buffer is still not a string
** buffer[0] is 'A', buffer[1] is 'B',
** all other elements of buffer are indeterminate */
}
free(buffer);
return(0);
}
언급URL : https://stackoverflow.com/questions/9142805/do-we-lose-data-in-a-buffer-after-reallocing
'programing' 카테고리의 다른 글
PHP: 파일에서 특정 행 읽기 (0) | 2023.07.25 |
---|---|
파이썬에서 사용자 이름과 암호를 안전하게 저장해야 하는데, 옵션은 무엇입니까? (0) | 2023.07.25 |
PowerShell에서 함수 오버로드 (0) | 2023.07.25 |
PHP cURL GET 요청 및 요청 본문 (0) | 2023.07.25 |
개체 속성으로 어레이에서 개체 제거 (0) | 2023.07.25 |