[英]C - Sum of Array using pointers
我已經嘗試了兩種方式的許多不同變體,並且無法將它與數組相加。 它作為指針傳遞給函數,需要計算均值並返回。
unsigned char calcMean(unsigned char *buffer, int height, int width)
{
unsigned char mean, sum=0;
counter i, k;
int size;
size = width*height;
mean = 0;
for (i = 0; i < size; i++) {
sum += buffer[i];
}
/*
for(k=0;k<(width*height);k++)
{
mean = mean + *Buffer;
frameBuffer++;
printf("%d\n", mean);
}
*/
return sum;
}
mean
可以是char,因為你會按size
除以計算它。 但sum
本身可以高達size
* 255(8位unsigned char
)。 width * height
也可以溢出。
為了安全起見(在32或64位機器上),請考慮以下事項:
16位* 16位整數需要32位整數(對於維度)。 一個大小最大為4294967295的unsigned char數組將需要64位的總和。
因此,如果可能,請使用顯式整數大小(C99):
uint8_t calcMean(uint8_t *buffer, uint16_t height, uint16_t width)
{
uint64_t sum=0;
size_t i;
size_t size;//size_t is large enough to store a pointer,
//so it would have 32 or 64bits on corresponding platforms
//(see uintptr_t, etc.)
size = ((size_t)width)*((size_t)height);
for (i = 0; i < size; i++) {
sum += buffer[i];
}
return sum / size;
}
為了防止buffer[]
數組的緩沖區溢出,假設您已定義數組並使用值初始化,請將數組的大小與指向數組的第一個元素的指針一起傳遞,而不是當前為calcMean()
。
對calcMean()
調用應該是:
uint8_t array_name[3]={1,2,3}; /* Array size and values assumed */
...
calcMean(array_name, sizeof(array_name))
calcMean()
定義應為:
uint8_t calcMean(uint8_t *buffer, size_t buffer_size)
{
uint64_t sum=0;
size_t i;
for(i = 0; i < buffer_size; i++)
{
sum += buffer[i];
}
..../*Do whatever you want if at all needed */
return (sum / size);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.