C - 将值分配给取消引用的双指针时的分段错误



我写了这个函数来计算 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 arrayn");
        *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=%lun", count, *begin, sum);
        begin += skip;
    }
    **result = ((uint32_t)(sum/count)); //segmentation fault here
    printf("result=%dn", **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 = %dn", *average);
//odd indices => 1,3,5,7
average_uint32_t(buffer + 1, buffer + BUFF_SIZE, 2, &average);
printf("average of odd elements = %dn", *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)

我做错了什么?我想平均函数的单个指针可以解决问题吗?但是为什么双指针不起作用?

这是因为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));

您将average定义为空指针。取消引用空指针是未定义的行为,在大多数 Unix 风格中,它会违反分段。

必须使用指向实变量的单个指针,或者如果要使用双指针,则 average 必须指向现有变量。

相关内容

  • 没有找到相关文章

最新更新