2012-02-14 2 views
0

지난 며칠 동안 C 클래스에 대한 과제를 수행하고 있었고 C의 realloc() 함수와 관련하여 궁금한 충돌이있었습니다. C/집안에있는 C++ 프로그래머는 내 코드에 무엇이 잘못 되었을지 즉시 대답 할 수 없었습니다.realloc()을 여러 번 호출하여 C 프로그램이 충돌합니다.

먼저 나는 한 함수 메모리 블록을 생성 :

char *line = (char *)malloc(sizeof(char) * BUFSIZE); 

는 그때 getMoreBuf(start_of_block, end_of_block)

int getMoreBuf(char *start, char *end) 
{ 
char *newBuf = 0; 
int newSize = (end - start) + BUFSIZE; 
    newBuf = (char *)realloc(start, sizeof(char) * newSize); 
    if(NULL == newBuf) { 
     printf("No virtual RAM available"); 
    }else{ 
     start = newBuf; 
    } 
    return newSize; 
} 

가 BUFSIZE = 1가, 그것이 5 호출 이후가 충돌 BUFSIZE을 (설정 내용에 따라 호출

1) 또는 3 번째 호출 (BUFSIZE = 5)을 사용하고 읽은 문자를 난센스로 바꿉니다.

누군가 내 오류를 지적하고 문제를 해결하기 위해 어디서 읽을 지 제안 할 수 있습니까? 도움을 주시면 감사하겠습니다. :)

보너스 질문 : 메모리 블록의 첫 번째 포인터와 두 번째 포인터 2를 가리키는 포인터 1로 메모리 블록을 malloc합니다. 내가 realloc() 블록 및 크기 문제로 인해 블록 이동, 포인터 2 여전히 이전 (지금은 쓸모없는) 블록 가리 킵니다 또는 메모리 블록의 새 위치 realloc 함께 "이동"합니까? ,

은 (또한 미래를 위해, 나는 새로운 질문에 여분의 질문을 넣어해야하거나 강하게 첫 번째 질문과 관련되어 있기 때문에 내가 여기에 둘 수 있습니다?)

는 귀하의 의견에 대한 여러분 모두 감사합니다 그것은 무엇이 잘못되었는지 알아 내는데 많은 도움이되었습니다. 만약 내가이 각각의 지긋 지긋한 포인터 사업에 대해 좀 더 이해할 수있는 어떤 형태로 도움이 되었기 때문에 나는 각각을 올바른 대답으로 표시 할 수있을 것이다. =)

+0

[* 심지어 프로그래머 *] (http://c-faq.com/ptrs/passptrinit.html) 어쩌면 당신은 C 프로그래머를 시도 했어야 했습니까? – cnicutar

+0

네, C와 C++ 프로그래머를 시험해 보았습니다. 나는 그것을 고정 시켰고 나는 링크를 조사 할 것이다. – Plastefuchs

답변

2

나는 당신의 문제는 당신이 로컬 변수 start을 변경하고 있다는 생각 ... 포인터를 사용해야합니다.

int getMoreBuf(char **start, char **end) 
{ 
    char *newBuf = 0; 
    int newSize = (*end - *start) + BUFSIZE; 
    newBuf = (char *)realloc(*start, sizeof(char) * newSize); 
    if(NULL == newBuf) { 
     printf("No virtual RAM available"); 
    } else { 
     *start = newBuf; 
     *end = *start + newSize; 
    } 
    return newSize; 
} 

그리고 당신이 그것을 좋아 호출 것 :

getMoreBuf(&start_of_block, &end_of_block) 
+2

'end'도 아마도 다시 계산 될 필요가 있습니다. 그렇지 않으면'newSize'를위한 계산은 잘못된 값을 전달할 것입니다 ... –

+0

@Martin : 당신은 절대적으로 옳습니다. 에서 편집 됨 – cha0site

+0

답장을 보내 주셔서 감사합니다! 나는 독자적으로 그것을 이해하기 위해 약간의 의견을 원했지만이 역시 효과가있다. 나는 다음 번에 이것을 염두에두기를 바랍니다. :) – Plastefuchs

3

이 :

start = newBuf; 

start가 수정된다. 그러나 start은 지역 변수입니다. 호출자가 가지고있는 변수에는 영향을 미치지 않습니다.

이 문제를 해결하려면 을 포인터 포인터로 사용하거나 newBuf을 반환해야합니다.

+0

@Plastefuchs : 아니요, 그렇지 않습니다. 포인터 자체를 수정해야하므로 포인터 (예 : 포인터 포인터)를 전달해야합니다. –

+0

답장을 보내 주셔서 감사합니다. 포인터와 함수에 대해 이미 알고 있다고 생각한 것들을 너무 많이 생각해 냈습니다. – Plastefuchs

2

문제는 start의 새로운 값이 getMoreBuf() 기능에서 통과되지 않을 것입니다 - 함수의 프로토 타입은 다음과 같이해야합니다 즉, 당신은이 작업을 수행하기 위해 이중 포인터를 필요 :

int getMoreBuf(char **start, char **end); 

은 (당신이 가능성도 그것을위한 새로운 값을 계산해야합니다 이후 너무 end 이중 포인터를했습니다.)

+0

빠른 답변 주셔서 감사합니다. – Plastefuchs

관련 문제