programing

재할당 후 버퍼의 데이터가 손실됩니까?

closeapi 2023. 7. 25. 20:58
반응형

재할당 후 버퍼의 데이터가 손실됩니까?

재할당이 어떻게 작동하는지 이해하는 데 어려움을 겪고 있습니다.만약 내가 버퍼를 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;

또한 주조 공정에서 발생하는 수익률 값도 참고하십시오.mallocC에서는 불필요하고 그것은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

반응형