C에서 realloc을 사용하는 방법 [중복]
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");
}
나는 또한 '문자열'에 대한 포인터를 만들고 포인터를 보내려고했는데 결과는 똑같습니다.
답변
공간을 더 추가하려고하면 realloc 기능이 작동합니까?
아니요, 해당 배열은 힙에 할당되지 않았기 때문입니다. 귀하의 경우에는 스택에 할당 될 가능성이 높고 크기를 조정할 수 없습니다. 간단히 말해서 : realloc
포인터를 인식하지 못하고 포인터로 무엇을해야할지 모르지만 어쨌든 무언가를 시도하므로 충돌이 발생합니다.
realloc
이전에에 전달 된 포인터 malloc
또는 널 포인터 에서만 호출 할 수 있습니다 . 이것이 바로 이러한 기능이 작동하는 방식입니다.
자세한 내용 은 스택 및 힙에 할당되는 항목을 참조하세요 . .
이전에 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)
.
realloc
기능은 (예를 들면 원래 할당 함수의 작은 그룹으로 만들어진 것들로 작동 malloc
, calloc
또는 realloc
, 또는 널 포인터 자체). string
그런 것이 없기 때문에 코드가 잘 정의되어 있지 않습니다.