浮点数不正确的大小 - C.

时间:2015-12-01 18:58:42

标签: c arrays

我正在编写一个程序,在给定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.我不知道这个数字来自何处并且它会破坏图像过滤。我在这里错过了什么吗?

2 个答案:

答案 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。