我正在编写一个程序,在给定BMP文件的情况下进行一些图像过滤。
我有一个为我做过滤的函数,但需要从stdin
得到的特定输入,我的程序需要以正确的格式输入它们。其中一个函数输入需要是一个浮点数组。此数组的大小由用户平方输入的数组宽度确定。因此输入3将产生一个大小为9的数组(模拟矩阵。为了进一步阅读我正在做的事情,请检查this Wikipedia link)。
我的程序正确接收过滤器宽度。它正确计算数组/矩阵大小值。但是,当初始化浮点数组以将值放入时,它会错误地执行此操作。
以下是相关代码:
int filter_width;
filter_width = atoi(argv[3]);
// Initializing variables for the filter weights array
int filter_matrix_size;
filter_matrix_size = filter_width*filter_width;
float filter_weights[filter_matrix_size];
如果过滤器宽度输入为3,我应该在这里为我的3个变量获取以下值:
过滤宽度:3
滤镜矩阵大小:9
filter_weights[]
= 9
但是,当我测试我的程序时,我将filter_weights[]
的大小设置为36.我不知道这个数字来自何处并且它会破坏图像过滤。我在这里错过了什么吗?
答案 0 :(得分:5)
sizeof
计算数组的总大小,而不是元素的数量。
假设你的系统上有sizeof(float) == 4
,那么你有
sizeof(float) == 4
sizeof(float[2]) == 8 (2 * sizeof(float))
sizeof(float[9]) == 36 (9 * sizeof(float))
如果你想要元素的数量,你可以除以第一个元素的大小
float arr[N];
(sizeof arr / sizeof arr[0]) == N
sizeof arr == (N * sizeof(float))
sizeof arr[0] == sizeof(float)
程序员经常为此定义一个宏:
#define LEN(A) (sizeof (A) / sizeof (A)[0])
float arr[N];
LEN(arr) == N
虽然我个人远离它,因为当使用指针而不是数组时它会让人感到困惑。
float *arr = malloc(/*whatever*/);
LEN(arr) == sizeof(float*)
答案 1 :(得分:3)
sizeof(filter_weights)
将为36,因为它包含9个四字节float
s。 9 x 4 = 36。