Matthew Schinckel
그는 물었다 12년 전
14

나는 왜 연산뿐 얻을 수 있는 무료 error: 대해 realloc 을 수행할 ()?

39, ve i& 쓰기 위해 노력했다 '*' 에서 C 로 작동하는 문자열으로 복귀시킴 함수를 사용하여 malloc () ',' 챨 디스크입니다. diskid 배정했다. # 39 의 it& 조금 다른 것 보다는 문자를 찾기와 바꾸기 문장열 시작 구체화하십시오.

39 의 경우 검색 및 교체 할 수 있는 사소한 it& 문자열은 동일한 길이 (또는 문자열 검색 대체하십시오 훨씬 짧은 문자열), 하도 충분한 공간이 할당할지. 만약 내가 사용하려고 합니다 () ',' 내가 하면 오류가 나는 대해 realloc 을 수행할 수 있는 알려주는 무료 - 난 이후, t, 나는 어떻게 연산뿐 don& # 39 만 사용하는 '나는 대해 realloc 을 수행할 ()'.

아마도 조금 코드 도움이 된다.

void strrep(char *input, char *search, char *replace) {
    int searchLen = strlen(search);
    int replaceLen = strlen(replace);
    int delta = replaceLen - searchLen;
    char *find = input;

    while (find = strstr(find, search)) {

        if (delta > 0) {
            realloc(input, strlen(input) + delta);
            find = strstr(input, search);            
        }

        memmove(find + replaceLen, find + searchLen, strlen(input) - (find - input));
        memmove(find, replace, replaceLen);
    }
}

이 프로그램은 ' ()' 에 대해 realloc 을 수행할 수 있는 방법, until I 시도하시겠습니까 인스턴스입니다 재장착하여 구체화하십시오 넘게 됩니다 초기 구체화하십시오. (그래도 종류의 작동됨 오류뿐만 아니라, 그냥 내뿜으며 아웃해야 결과).

도움이 된다면, 호출하는 코드는 다음과 같습니다.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void strrep(char *input, char *search, char *replace);

int main(void) {
    char *input = malloc(81);

    while ((fgets(input, 81, stdin)) != NULL) {
        strrep(input, "Noel", "Christmas");
    }
}

답변 8 개

일반적으로, 절대 할 수 있는 무료 또는 사용자 제공 합니다 대해 realloc 을 수행할 것을 의미한다. # 39 는 사용자 공간 할당할지 don& 위치를 알 수 있습니다. (in your 모듈에서는 또 다른 DLL) 모든 기능을 사용할 수 있도록 할당일까요 사용자에 대한 것을 의미한다.

단, 이제 조금 내의 모든 기능을 수행할 수 없습니다 reallocation 합니다 비헤이비어를 하나만 때문에 사용자는 변경할 수 있게 하는 것과 교체 연산 결과 구체화하십시오 최대 길이 사용할 수 있을 만큼 오랜 기간 동안 이 번호요 제공하십시오 버퍼입니다 교체품 발생할 수 있습니다.

그럼 다른 함수를 만들 수 있다 할 수 있지만, 여러 교체품을 할당할지 전체 결과 문자열 및 사용자 입력을 할 공간이 복사합니다를 구체화하십시오. 다음 방법을 제공해야 합니다 삭제하시겠습니까 문자열이어야 할당할지 있습니다.

그 결과:

void  strrep(char *input, char *search, char *replace);
char* strrepm(char *input, char *search, char *replace);
void  strrepmfree(char *input);

39 m, first off, 미안해요 I& 늦게 했다. 이것은 스택 오버플로 (my first 대답. )

일러주라하셨으니 대해 realloc 을 수행할 수 있는 것으로 지적되고 있다 () 는 메모리의 포인터를 변경할 수 있습니다 '라는 기술입니까 나왔다. 이 경우 인수 &quot string"; 유효하지 않게 됩니다. 심지어 이 재지정하면 댁이라면 변경하십시오 아웃해야 유효범위 일단 함수은 끝난다.

이 질문에 대해 realloc 을 수행할 () 가 OP, 포인터입니다 새로 나왔다 메모리. 반환 값은 어딘가에 저장될 수 있어야 합니다. 일반적으로 이렇게 됩니다.

data *foo = malloc(SIZE * sizeof(data));
data *bar = realloc(foo, NEWSIZE * sizeof(data));

/* Test bar for safety before blowing away foo */
if (bar != NULL)
{
   foo = bar;
   bar = NULL;
}
else
{
   fprintf(stderr, "Crap. Memory error.\n");
   free(foo);
   exit(-1);
}

39 로 can& 티부르 점, 친구들, t 에 대한 입력입니다 이 함수 포인터의 값을 변경하십시오 전달되는. 원하는 대로 지정할 수 있습니다, 하지만 아웃해야 유효범위 끝에 검색하기를 변화가 시작된다. 그 다음 블록, &quot input"; 일단 잘못된 포인터입니다 함수은 완료하는지 수도 있고 아닐 수도 있습니다.

void foobar(char *input, int newlength)
{
   /* Here, I ignore my own advice to save space. Check your return values! */
   input = realloc(input, newlength * sizeof(char));
}

마크 반환하는 함수 포인터를 출력물에는 새로운 이와 관련된 작업을 한다. 그렇게 할 경우, onu 를 사용할 수 있는 요청자에게 포인터를 사용하여 그는 다시는 입력입니다. 그런 경우 반환 값 일치시킵니다 동일한 별색이 연락해야 할 수 있는 두 개의 포인터 () 에 있으며, 오직 그 희망이었네 무료 # 39 점, t 일치시킵니다 don& 슬래시나 입력 프로세스를 소유하고 있는 메모리 포인터입니다 이제 수도 있고 아닐 수도 있습니다. 데레페렌츠링 그는혼자서 세그멘테이션.

연산뿐 포인터입니다 입력에 대해 다음과 같이 사용할 수 있습니다

void foobar(char **input, int newlength)
{
   *input = realloc(*input, newlength * sizeof(char));
}
이 경우 발생할 수 있는 입력 포인터입니다 요청자에게 복제본입니다 복제본임을 여전히, 어딘가 잘못된 됐다.

제 생각에 대해 realloc 을 수행할 때 () 함수를 사용하여 깨끗한 피하기 위해 솔루션 슬라이드에서는 수정하려고 caller& # 39 의 입력입니다. 그냥 내버려 복귀하십시오 버퍼 malloc (), 새, 그리고 이전 여부를 결정할 수 있는 무료 요청자에게 사용한다. 이 때문에 이 할 수 있다는 이점도 요청자에게 렉시한테서 원래 문자열을!

2 달 반 전에 다른 사람이 늦으면 당에 대해 사과했다. 오 나도 꽤 많은 시간을 보내게 하는 소프트웨어) 을 포함하였다.

39 에 대해 아무도 관심 있는 i&, m 은 원래 설계 또는 명시적으로 메모리 손실이 1 씩 오프하도록 오류:. 그리고 그건 왜 못 받는 상황을 정확히 알려주는 메모리 누수가 무료 연산뿐 오류 (같도다라고, 정확히, 틀렸다니까 확보됨 동일한 메모리 언로드하기 짓밟고 해제된 메모리를 통해 얻을 수 있으며 이미 여러 번 - 후).

39 라고 말하는 자들, 전에 실시하는 분석, I& 동의하는 모든 사용자 인터페이스는 미만임 때문이다. 그러나 이 & # 39 처리할 경우 메모리 누수를 / 짓밟고 문제 및 문서화했습니다 할당할지 memory& # 39, 합니다. # 39, & # 39, OK& 요구 사항, 걸릴 수 있다.

문제는 무엇입니까? 뭐, 걍 패스 () 와 재할당하지 버퍼입니다 () 가 이 지역에 대해 realloc 을 수행할 수 있는 새로운 포인터입니다 콩지름에 - 진실이며당신이 무시하시겠습니까 반환 값. 따라서 가능한 한 것, 그리고 당신이 대해 realloc 을 수행할 () 는 원래 메모리 통과시킬 것을 또 다시 같은 포인터입니다 you& # 39, 정보기술 (it), re 확보됨 두 번 다시 원래 값을 전달할 수 있기 때문에 동일한 메모리. 하지만 이 메모리 누수가 있는지 계속 사용할 뿐 아니라, 존 Downey& 고말은 원래 공간의 - # 39 점을 지적하고, s shot in the dark () 이지만, t # 39 얼마나 심하게 강조하십시오 틀렸다니까 대해 realloc 을 수행할 잘못 doesn& 틀렸다니까 언로드하기. 역시 1 씩 오프하도록 there& s # 39, & # 39 nul 위한 충분한 공간이 없기 때문에 오류가 할당할지 \0& # 39;; 가 있는 구체화하십시오.

메모리 누수 발생 메커니즘을 제공합니다 알려줄 수 없기 때문에 마지막 가치에 대한 요청자에게 구체화하십시오. 너 때문에 원래 문자열을 통해 계속 짓밟고 있는 공간을 마련해 석방된 후, 마치 당신의 코드를 호출하는 코드를 신앙이니라 스페이스 너무 받을 수 있다고 할 수 있기 때문에 무료 연산뿐 오류 또는 메모리 제어 정보는 코어 덤프 또는 avamer 완전히 스크램블됨.

또한 doesn& 코드에서 # 39, & # 39, # 39 Noel& 교체하십니까 포지셔닝합니다 양정치 성장을 막을 수 없다. # 39, & # 39, 함께 조이유 Noel&. 하지만 you& 문자를 찾을 때마다 다른 7 개 추가 됩니다; d # 39 의 노엘 확장하십시오 재장착하여 텍스트 및 정보기술 (it), 드릴링됩니다 등등 (아래) 이 문제를 해결할 수 없습니다 - simple solution 은 아마 내 수정 여부를 확인할 수 있는 대체 문자열을 string 검색을. 문자열 검색 후 계속 대체 건너뛰려면 복귀시킴 놓고 있다. 두 번째 비 사소한 문제를 해결하기 위해 코딩 보유하고 있다.

그래, 내 제안됩니다 개정판이 호출됨 기능은:

char *strrep(char *input, char *search, char *replace) {
    int searchLen = strlen(search);
    int replaceLen = strlen(replace);
    int delta = replaceLen - searchLen;
    char *find = input;

    while ((find = strstr(find, search)) != 0) {
        if (delta > 0) {
            input = realloc(input, strlen(input) + delta + 1);
            find = strstr(input, search);            
        }

        memmove(find + replaceLen, find + searchLen, strlen(input) + 1 - (find - input));
        memmove(find, replace, replaceLen);
    }

    return(input);
}

이 코드는 메모리 할당 오류를 찾을 수 없는 경우 () - 아마도 충돌 (단, 그렇지 않을 경우 메모리 누수가) 대해 realloc 을 수행할 수 없습니다. # 39, & # 39 의 com/go/lrvid4005_ps_kr 스티브야 Maguire& 먹어서나 솔리드로 Code& # 39. 책 내용에 대해 광범위한 조사를 위한 메모리 관리 문제.

Markus Safar
Matthew Schinckel
그는 12년 전 댓글을 달았습니다
1

고마워, 이는 내가 정말 좋은 것은 잘못된 분석을 하고 (그 무료 연산뿐 롬폭 한 차원 높일 수 있는 몇 가지 점에서 잘못된 하고 있었어요.)

저는 그냥 대해 realloc 을 수행할 수 있는 확장 메모리 할당 - had it in my head () 는 전혀 말이 안 돼 있는 때, 생각해보니!

Just a shot in the dark haven& 대해 realloc 을 수행할 때, 그 이유는 아직 t # 39 이 처럼 malloc 포인터입니다 되돌려줍니다 했다. 대해 realloc 을 수행할 수 있기 때문에 필요에 따라 작업하는 경우 대부분 잘못된 포인터입니다 포인터입니다 움직이십시오 틀렸다니까 don& # 39, t 방법은 다음과 같습니다.

input = realloc(input, strlen(input) + delta);

Roger Lipscombe
그는 11년 전 댓글을 달았습니다
0

만일 실패하면 NULL, 기존 버퍼 및 찻입 되돌려줍니다 대해 realloc 을 수행할 수는 없다. # 39 는 그냥 손실됩니다 you&, ve 포인터입니다. :- (

  • 참고, html 코드 값으로 이스케이프입니다 codes.* 변경하십시오 봅니다

뭐, 내가 사용하는 C/C++, 이후 현재까지 표시되어도 귈이예요 성장하는 재사용합니다 포인터 값을 메모리에 대해 realloc 을 수행할 경우 기존 후 방이요 디렉토리에만 메모리 블록.

예를 들어, 이러한 측면에서 볼 때:

(xxxxxxxxxx.)

첫 번째 x 가리키는 포인터를 경우, 그리고. 메모리 위치를 가리키는 메모리 크기에 따라 성장 및 고말은 풀려났거든 변수로 5 바이트입니다 it& # 39, ll 성공했다. 이는 물론 간단한 예를 들어 특정 크기의 블록으로 최대 라운드됩니다 맞춤에는 있지만 어쨌든.

그러나 나중에 다시 한 번 10 만 사용할 수 있는 이유가 있고, 이를 통해 성장할 것으로 시도하시겠습니까 바이트입니다 합니다 움직이십시오 5 블록에서 메모리이고 업데이트하십시오 포인터입니다.

그러나 너회의 예제에서와 틀렸다니까 반군지역 함수가 아닌 문자 포인터입니다 포인터입니다 너회의 변수, 함수 및 카타시안 스트로프 변수를 사용할 수 있을 때 내부적으로 조정하십시오 컴포지션이 지역 변수를 스트로프 원래 포인터 변수 값을 함수를 호출하는 코드를 사용하여 조종됩니다 남게 될 것이다.

그러나 최근 이 포인터 값을 석방되었다고.

이 경우, 입력 원인입니다.

하지만, 제가 다른 할 것이라고 제안했다. It looks like 이 네 경우엔, 이 경우, 그것은 실로 입력입니다 입력입니다 가변입니다 shouldn& 수정되므로 # 39, t be at all.

난 이렇게 또 다른 방법으로 그리웠댔지 찾아야 할 수 있다 이런 부작용을 변경하지 않고 입력입니다 , 추적할 어렵다.

대해 realloc 을 수행할 이즈 스트레인지, 복잡하고 많은 시간이 초당 많은 양의 메모리를 다루는 경우에만 사용해야 합니다. 즉, 여기서 실제로 코드를 더 빠르게 수 있습니다.

나는 볼 수 있는 코드

realloc(bytes, smallerSize);

사용한 협력했습니다 버퍼 크기를 조절할 수 있기 때문에 작다. 약 백만 배 협력했습니다 대해 realloc 을 수행할 수 있도록 했다 하더라도, 그 다음 몇 가지 이유로 조교하실 납기를 단축할 수 있어 좋은 것이라고 제공하십시오 버퍼, 임의의 두 번째로 1/2 배치하십시오 폭락을 새로운 복제본입니다. 나쁜 물건을 들어온넘.

항상 사용하여 반환 값 대해 realloc 을 수행할.

사용할 수 있는 것으로 보인다.

char *strrep(char *string, const char *search, const char *replace) {
    char *p = strstr(string, search);

    if (p) {
        int occurrence = p - string;
        int stringlength = strlen(string);
        int searchlength = strlen(search);
        int replacelength = strlen(replace);

        if (replacelength > searchlength) {
            string = (char *) realloc(string, strlen(string) 
                + replacelength - searchlength + 1);
        }

        if (replacelength != searchlength) {
            memmove(string + occurrence + replacelength, 
                        string + occurrence + searchlength, 
                        stringlength - occurrence - searchlength + 1);
        }

        strncpy(string + occurrence, replace, replacelength);
    }

    return string;
}

어쨌든, 그것 없이는 빨아들이는 코드) 로 보면 한숨 있나요?

Mark
Matthew Schinckel
그는 5년 전 댓글을 달았습니다
0

주석, 주석, 주석 달기 전에 작성된 이후 추가에는 표시됨과 오토메이티드 수 있었다. 처음에는 스위치에서만 변경해야 하는 것으로 보인다. # 39 가능성이 있는 만큼, t really 스테이드 한다는 게 내가 didn& 변경하십시오 모두야!

내 신속시작 힌트.

대신: ' (char , , 검색 입력입니다 챨 챨 복귀시킴)' void 스트로프 종료기: 'void 스트로프 (, , 검색, 챨 &amp 챨 입력입니다 챨 복귀시킴)'

및 투자에 본문: 입력 (input, 스트린 (입력) + 델타), '=' 대해 realloc 을 수행할

일반적으로 함수 () 및 대해 realloc 을 수행할 반군지역 검토완료 인수만 값으로 / 참조입니다 설명:).

Jonathan Leffler
그는 4년 전 댓글을 달았습니다
0

Void 스트로프 표기법을 ' (char , , 검색, 챨 &amp 입력입니다 챨 복귀시킴)' 이 (가) 에서 사용할 수 없는 C - 비록 C++ 언어로 사용할 수 있습니다. 문제는, 적이 아니다, 아파리스트 태그로 첨부됩니다 c++컴파일러는. 이 코드는 제일 합니다 (char , , 검색 입력입니다 챨 챨 복귀시킴) 'void 스트로프 표시되어도 it& # 39 의 간편한 것이 아니냐는 분석이 나오고 있다' '챨 스트로프 (const char const char const char 입력, 검색, 교체)' 은 작업 인터페이스 (, # 39 입력 문자열에서도 aren& 않았다. 수정된 문자열은 할당할지 반환함).