2011-08-16 4 views
5

내가 갖는 문제를 사용하여 해방 후 포인터를 사용 : 나는 세그먼트 오류를 ​​받고 있어요다음 코드 유형 무료()

int* myPointer1 = malloc(50 * sizeof(int)); 
int* myPointer2 = malloc(50 * sizeof(int)); 
free(myPointer1); 
myPointer1 = myPointer2; 
myPointer1[0] = 3; 

. 뭐가 문제 야?

+5

malloc 작업이 성공적으로 수행되었는지 확인 했습니까? myPointer1을 NULL에 할당하지 않을 수 있습니다. – djhaskin987

+0

어디에서 segfault합니까? 'free (myPointer1)'또는'myPointer1 [0] = 3'에서? – Seth

+0

'malloc'이 성공하면 segfault가 없어야합니다. 여러분이하고있는 일은'myPointer1'의 원래 메모리 위치에서 메모리를 비운 다음'myPointer1'을'myPointer2'의 위치에 재 할당하는 것입니다. 그러나 마지막 비트의 메모리를 해제하려는 경우 동일한 주소를 가리 키기 때문에 포인터 중 하나 (예 :'myPointer1' 또는'myPointer2') 만 해제하면됩니다. – RageD

답변

3

이 코드에는 문제가 없습니다. 귀하가 올린 스 니펫은 정확하고 격리되어 잘 작동합니다.

+0

코드 스 니펫이 정확하기 때문에 정확합니다. 작동하기 때문에 올바르지 않습니다. UB 와도 잘 작동하여 예상치 못한 상황에서 잘 날아갈 수 있습니다. –

+2

"코드 스 니펫이 정확하기 때문에 정확합니다."-> http://xkcd.com/703/ =) – jadarnel27

+2

제대로 작동했기 때문에 제대로 작동하지 않는다고 말하지 않았습니다. 그것은 명백한 정의되지 않은 동작을 포함하고 있습니다.), * 그리고 * 작동합니다 (예를 들어, 나는 세그먼트 화 된 오류를보고하지 않습니다). – duskwuff

2

당신의 코드는 아무 문제가 없지만 malloc() 함수의 반환 값을 테스트하는 습관을 가지고 있습니다. NULL이면 프로그램에 문제가 생깁니다. 우리의 경우 메모리 할당은 다음과 같습니다. malloc() 함수가 실패했습니다.