2016-06-10 95 views
0

我已经写了这个功能在一个UINT32阵列的奇数或偶数索引计算值的平均值:分段错误将值分配给当解引用双指针

void average_uint32_t(uint32_t * begin, uint32_t *end, 
      uint8_t skip, uint32_t **result){ 

    //safety check 
    if(begin == end || begin > end) { 
     printf("begin and end pointer does not belong to an array\n"); 
     *result = 0; //set pointer to null 
     return; 
    } 

    uint64_t sum = 0; 
    uint32_t count = 0; 

    while(begin <= end) { 
     sum += *begin; 
     count++; 
     printf("count=%d,value=%d,sum=%lu\n", count, *begin, sum); 
     begin += skip; 
    } 

    **result = ((uint32_t)(sum/count)); //segmentation fault here 
    printf("result=%d\n", **result); 
} 

我测试像这样的功能:

//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因为平均可以是一个浮点数。所以,如果你打算使用双,那么你还需要行

**result = ((uint32_t)(sum/count));
更改为
**result = ((double)sum/(double)count));

+0

感谢解决了这个问题,好点,但为什么它没有指向一个有效的内存地址在开始? –

+0

@SaeidYazdani:'uint32_t * average'是一个指针,uint32_t * average = 0;'只是表示'uint32_t * average = NULL;'。所以,如果你理解初始化一个指向NULL的含义,那么很明显,在大多数平台上'0'最有可能是受限制的内存位置。 – sameerkn

1

您定义average作为一个空指针。它是Undefined Behavior来取消引用空指针,并且在大多数Unix版本中,它会给出分段违规。

,如果你想使用双指针,平均必须点到一个现有的变量,您必须使用一个指针指向一个真实变量,或。