C에서 realloc을 사용하는 방법 [중복]

Nov 25 2020

realloc 함수를 사용하여 메모리를 재 할당하려고하는데 이전에 malloc을 사용해야한다는 것을 알았지 만 다음 문자열을 생성한다고 가정 해 봤기 때문에 반드시 사용해야하는지 이해할 수 없습니다.

char string[] =  "fun";

공간을 더 추가하려고하면 realloc 기능이 작동합니까?

그것은 저를 제 질문으로 인도합니다. 저는 단순히 문자열 끝에 문자 하나를 추가하려고 노력하고 있습니다. 'p'라고 말하겠습니다. 그러나 어떤 이유로 프로그램을 실행할 때마다 프로그램이 realloc 줄에서 뭉개집니다.

내 전체 코드는 다음과 같습니다.

int main()
{
char string[] =  "fun" ;
str_func(string);
printf("%s", string);
return 0;
} 

void str_func(char* str)
{
str = (char*)realloc(str, strlen(str) + 2);
strcat(str, "p");
}

나는 또한 '문자열'에 대한 포인터를 만들고 포인터를 보내려고했는데 결과는 똑같습니다.

답변

1 Lundin Nov 25 2020 at 19:32

공간을 더 추가하려고하면 realloc 기능이 작동합니까?

아니요, 해당 배열은 힙에 할당되지 않았기 때문입니다. 귀하의 경우에는 스택에 할당 될 가능성이 높고 크기를 조정할 수 없습니다. 간단히 말해서 : realloc포인터를 인식하지 못하고 포인터로 무엇을해야할지 모르지만 어쨌든 무언가를 시도하므로 충돌이 발생합니다.

realloc이전에에 전달 된 포인터 malloc또는 널 포인터 에서만 호출 할 수 있습니다 . 이것이 바로 이러한 기능이 작동하는 방식입니다.

자세한 내용 은 스택 및 힙에 할당되는 항목을 참조하세요 . .

1 Useless Nov 25 2020 at 19:58

이전에 malloc을 사용해야한다는 것을 알았지 만 꼭 사용해야하는지 이해가 안 돼요

이 경우 필요 사용 malloc하실 수 있습니다 전에 realloc뭔가, 다음 정의는 한다realloc가지가 원래 할당 malloc.

존재하지 않는 "필요"와 "필수"사이의 공간을 찾으려고합니다.

... 어떤 이유로 프로그램이 realloc을 압도합니다.

을 사용해야 한다는 것을 이미 알고 있다고 말씀하셨습니다 malloc. 그런 다음을 사용하지 않았고 malloc이것이 왜 문제인지 묻는 것입니다. 당신은 적어도 수있는 시도 가 해결되면 문제를보고 당신이, 당신은 할 필요가 "알고있다"는 일을하고.

프로그램은 아마도 다음과 같이 보일 것입니다.

int main()
{
  /* array is an automatic local variable. It wasn't dynamically allocated
     in the first place, so can't be dynamically re-allocated either.
     You cannot (and don't need to) free it either, it just goes out of scope
     like any other automatic variable.
  */
  char array[] = "fun";

  /* you need to use malloc (or one of the other dynamic allocation functions)
     before you can realloc, as you said yourself */
  char *dynamic = malloc(1+strlen(array));
  memcpy(dynamic, array, 1+strlen(array));

  /* realloc can move your data, so you must use the returned address */
  dynamic = str_func(dynamic);
  printf("old:'%s', new:'%s'\n", array, dynamic);

  /* not really essential since the program is about to exit anyway */
  free(dynamic);
} 

char* str_func(char* str)
{
  char* newstr = realloc(str, strlen(str) + 2);
  if (newstr) {
    strcat(newstr, "p");
    return newstr;
  } else {
    /* we failed to make str larger, but it is still there and should be freed */
    return str;
  }
}

원래 조건이 정확하지 않습니다. 실제로 포인터가 realloc

... 이전에 의해 할당되어야한다 malloc(), calloc()realloc()그리고 아직 무료로 전화 또는 realloc을 함께 해제되지

[OR] ptr이 NULL 인 경우 동작은를 호출하는 것과 같습니다 malloc(new_size).

paxdiablo Nov 25 2020 at 19:31

realloc기능은 (예를 들면 원래 할당 함수의 작은 그룹으로 만들어진 것들로 작동 malloc, calloc또는 realloc, 또는 널 포인터 자체). string그런 것이 없기 때문에 코드가 잘 정의되어 있지 않습니다.