2011-10-23 2 views
-2

이것은 숙제이므로 코드를 게시하고 싶지는 않지만 버그가 꽤 있습니다.Realloc 잘못된 포인터 C

현재 배열이 malloced 있고 배열에 포인터를 복사하고 있습니다. 이제, 나는이 배열로 memcpy와 memmove를 수행 할 수있다.

그러나 realloc을 사용하면 잘못된 포인터 오류가 발생하며 그 이유는 전혀 알지 못합니다.

아무도 도와 줄 수 있습니까?

+2

'realloc'및 친구들에게만 코드를 표시해야합니다. – Jon

+1

코드를 제공 할 수 있습니까? – Xyand

+1

일부 코드 추가 ... 문제가 발생하지 않습니다. –

답변

1

당신은 '이 배열에 대한 포인터를 다른 변수에 복사합니다'라고 말했습니다. 문제는 realloc을 수행하자마자 원래 포인터가 더 이상 유효하지 않다는 것입니다. 나는 포인터를 변수에 복사하는 이유를 보지 못합니까? 포인터 당신이 하나 (정확히 malloc()처럼 작동하는 경우 또는이다 NULL) malloc(), calloc() 또는 realloc()에서 이전에 반환 된 전달하면

+0

그냥 내 생각을 돕기위한 것이 었습니다. 이제 그걸 꺼내서 배열에 직접 realloc을 호출했습니다. 그래도 여전히 충돌합니다. – praks5432

+0

기본적으로 당신은 void * ptr = malloc (100); void * next_ptr = realloc (ptr, 200); 잘못된 포인터가 나옵니까? 이드는 디버거를 사용하지 않는 한 코드를 통해 점에서 값을 출력한다고 말합니다. malloc에서 가져온 값을 확인한 다음 realloc에 ​​전달 된 값을 확인하십시오. 나는 그들이 다르다고 추정 할 것이다. 당신이 어떤 라인을 바꿀 때까지 다양한 점에서 변수의 값을 봐라. –

+0

ok 나는 memcpy가 완료된 배열의 메모리 주소를보고 있었고 realloc은 완료되었고 정확히 동일하다. – praks5432

2

realloc()에만 작동합니다.

배열에서 호출 할 수 없습니다. 이 같은 struct이있는 경우 :

struct foo { 
    char a; 
    int x[5]; 
    double z; 
}; 

당신은 x의 크기를 증가 realloc()을 사용할 수 없습니다.

struct foo { 
    char a; 
    int *x; 
    double z; 
}; 

... 그리고 당신이 struct의 인스턴스를 만들 때, 당신은 초기 할당 malloc() 전화 : 포인터로 구조체 멤버 변경 : 대신 완전히 동적 할당을 사용하도록 전환해야한다

struct foo f; 

f.x = malloc(5 * sizeof f.x[0]); 

이제 f.xrealloc()를 호출 할 수 있지만, 비용은 구조체가 더 이상 필요하지 않은 경우 당신은 또한 f.xfree()를 호출하지해야한다는 것입니다.

0

realloc 또는 유효하지 않은 포인터 오류 또는 세그먼트 폴트, 에서 free 결과 당신은 당신이 malloc에서 얻은 유효한 포인터를 전달하는, 그럼 좋은 가능성이 당신이 당신의 기억을 손상한다는 것입니다 확신 : 당신은이 지역에 썼다 여기서 malloc은 메모리 블록의 책 보관을 저장합니다. 귀하의 경우 이것은 memcpy 또는 memmove입니다.

valgrind 메모리 오류 감지기를 사용하면 이러한 오류를 쉽게 찾을 수 있습니다.