동적으로 생성 된 배열의 크기를 줄이는 데 어려움이 있습니다. 이 64
를 인쇄,하지만 난 그게에 예상대로 세그먼트 폴트 오류가 발생하지realloc이 배열을 축소하지 않는 이유는 무엇입니까?
int main(void) {
// Intialize big array
int * a = (int *)malloc(10*sizeof(int));
assert(a);
// Fill it with squares
for (int i = 0; i < 10; ++i)
a[i] = i*i;
// Expected to print 64
printf("%d\n", a[8]);
// Shrink the big array
int * b = (int *)realloc(a, 5*sizeof(int));
assert(b);
// Expected to cause SEGFAULT
printf("%d\n", b[8]);
return 0;
}
모든 것이, printf("%d\n", b[8]);
라인을 제외하고 잘 작동 : 여기처럼 내 main
기능이 어떻게 표시되는지를 보여줍니다. 왜?
내가 간단한 것을 놓친 것 같아. 왜냐하면 나는 realloc
으로 메모리를 축소하는 것과 관련된 많은 의문점을 봤지만, 모두 가능하다고 말하기 때문이다.
저는 GCC 4.8.2에서 우분투 14.04를 사용하고 있습니다. -std=c99
옵션으로 컴파일하고 있습니다.
지난 몇 일간이 질문 또는 거의 동일한 질문을 받았지만 바로 찾을 수 없습니다. 'realloc()'은 사용 가능한 메모리의 내부 풀에 메모리를 반환하지만 그것으로부터 읽거나 쓰려고하면 정의되지 않은 행동이 발생하지만 일반적으로 메모리를 매핑 해제하지 않으므로 일반적으로 액세스하면 충돌이 직접 발생하지 않습니다 -하지만 해제 된 메모리에서 읽는 것은 매우 나쁜 습관이며, 해제 된 메모리에 쓰는 것은 훨씬 나빠집니다. –
_ {Rewrite} _ 제안 된 복제본에 대해 확실하지 않습니다. 제안 된 복사본은'realloc()'또는'malloc()'과 아무런 관련이 없습니다. 현재로서는 필자가 지적하기에 좋은 복제본이 없지만 철저한 검색을 수행하지는 않았습니다.나는 내가 기억하고 있다고 생각했던 '가까운 곳으로 가깝다'는 것이 OP에 의해 삭제 된 것으로 의심된다. 전체적으로이 것을 열어 두십시오. –
예,이 질문과 제안 된 복제본 모두는 배열의 경계 밖에서 데이터를 읽고 쓰는 것에 관한 것입니다.이 경우에는 동적으로 할당되고 다른 하나는 일반 (전역 변수)으로 할당됩니다. 그 정도까지, 그들은 중복됩니다. 그러나 할당 된 공간이 줄어들 때까지 합법적이었던 것을 액세스하는 것에 비해 부정적인 인덱스에 중점을 두는 것이 차이가 있다고 생각합니다. 중복 클로저에 대해서는 논쟁을하지 않겠지 만, 동적으로 할당 된 메모리와 축소를보다 명확하게 처리하는 중복 된 복사본을 찾는 것을 선호합니다. –