2016-06-10 2 views
0

는 I는 UINT32 어레이의 홀수 또는 짝수 인덱스에서 값의 평균을 계산하기 위해이 함수를 썼다세그먼트 오류 해제를 언급 이중 포인터

//BUFF_SIZE = 8 
uint32_t buffer[BUFF_SIZE] = {0,1,2,3,4,5,6,7}; 

uint32_t * average = 0; //memory to get result back 

//even indices => 0,2,4,6 
average_uint32_t(buffer, buffer + BUFF_SIZE - 1, 2, &average); 
printf("average of even elements = %d\n", *average); 

//odd indices => 1,3,5,7 
average_uint32_t(buffer + 1, buffer + BUFF_SIZE, 2, &average); 
printf("average of odd elements = %d\n", *average); 

그러나 프로그램의 평균에 결과 할당을 지정할 때 세그먼트 화 오류가 발생합니다 (함수 코드에 주석 처리 한대로). 출력은 다음과 같습니다.

count=1,value=0,sum=0 
count=2,value=2,sum=2 
count=3,value=4,sum=6 
count=4,value=6,sum=12 
Signal: SIGSEGV (Segmentation fault) 

무엇이 잘못 되었나요? 나는 평균 함수에 대한 단일 포인터가 문제를 해결할 수있을 것 같아? 하지만 이중 포인터가 작동하지 않는 이유는 무엇입니까?

답변

1

uint32_t *average이 유효한 메모리 영역을 가리키고 있지 않기 때문입니다.

이 시도 :

uint32_t uiAverage = 0; 
uint32_t *average = &uiAverage; 

더 나은 평균 부동 소수점 숫자가 될 수 있기 때문에 double 대신 uint_32_t을 사용하는 것입니다. 당신이 두 번 사용하려는 경우 그럼 당신은 또한 당신은 널 포인터로 average을 정의
**result = ((double)sum/(double)count));

+0

문제를 해결해 주셔서 감사합니다. 좋은 점이 있지만 처음부터 유효한 메모리 주소를 가리키지 않는 이유는 무엇입니까? –

+0

@SaeidYazdani :'uint32_t * average'는 포인터이고'uint32_t * average = 0;'은 단순히'uint32_t * average = NULL;'을 의미합니다. 따라서 'NULL'에 대한 포인터를 초기화하는 것이 무엇을 의미하는지 이해한다면 '0'은 대부분의 플랫폼에서 제한된 메모리 위치 일 것입니다. – sameerkn

1

에 선

**result = ((uint32_t)(sum/count));
을 변경해야합니다. null 포인터를 역 참조하기위한 Undefined Behavior이며, 대부분의 Unix 계열에서는 세그먼트 위반이 있습니다. 기존 변수에 더블 포인터, 평균 해야 포인트를 사용하려는 경우

당신은 진짜 변수를 가리키는 하나의 포인터 를 사용하거나 다음 중 하나를 수행해야합니다.