我真的不明白这一点。也许有人可以解释我。 我想知道dataInput中有多少个元素。我在C编程
void Calibrate_data(float* dataInput)
{
int dataSize = sizeof(*dataInput)/sizeof(float);
printf("%i and %i",sizeof(*dataInput)/sizeof(float),dataSize);
}
输出结果为:
1 and 10
答案 0 :(得分:4)
这是错误的格式说明符:
printf("%i and %i",sizeof(*dataInput)/sizeof(float),dataSize);
^^
sizeof
返回{em> unsigned 的size_t
类型,在Visual Studio中正确的格式说明符为%zu
或%Iu
。
使用错误的格式说明符会调用undefined behavior,但这似乎无法解释10
对dataSize
的输出没有意义,因为sizeof(*dataInput)
将是大小一个float
。所以我们希望sizeof(*dataInput)/sizeof(float)
为1
,因为Macattack说SSCCE应该有助于解决这个问题。
答案 1 :(得分:2)
当将数组传递给函数时,它会衰减到指针。您无法计算指针的大小,因此sizeof不会给出元素的数量。如果需要,可以将数组大小作为函数的参数传递。
这里*dataInput
是第一个元素,它是浮点类型。因此sizeof(*dataInput)
表示sizeof(float)
。
sizeof(*dataInput)/sizeof(float) = 4/4 = 1;
示例代码:
#include<stdio.h>
void Calibrate_data(float* dataInput);
int main()
{
float data[] = { 12.22, 15.15 };
Calibrate_data(data);
return 0;
}
void Calibrate_data(float *dataInput)
{
printf("float size : %zu %zu\n", sizeof(*dataInput), sizeof(float));
int dataSize = sizeof(*dataInput)/sizeof(float);
printf("%zu and %d\n",sizeof(*dataInput)/sizeof(float),dataSize);
}
输出:
float size : 4 4
1 and 1
修改强>
输出10
可能是格式指定符的错误用法,或者输出可能是'1',即从其他位置打印'0'。因为他没有在printf的末尾添加换行符,所以我们无法保证与此printf相关的最后0
。
答案 2 :(得分:2)
这可能是64位平台的问题,该平台使用32位int
和64位用于size_t
(sizeof
的结果类型)。
在这种情况下
printf("%i and %i",sizeof(*dataInput)/sizeof(float),dataSize);
^ ^ -------------------------------- --------
| | ^ ^
| | | +---- 32-bit operand
| | +--- 64-bit operand
| |
| +--- expects 32-bit operand
|
+--- expects 32-bit operand
转换说明符和操作数不匹配会导致未定义的行为。
以下其中一项应解决问题:
printf("%i and %i",(int) (sizeof(*dataInput)/sizeof(float)),dataSize); // cast size_t type to int
// as mentioned by Shafik Yaghmour in his answer - http://stackoverflow.com/a/21266299/12711
// this might not be supported on compilers that don't claim C99 support,
// for example, MSVC docs indicate that "I" should be used instead of "z" for size_t types
printf("%zu and %i",sizeof(*dataInput)/sizeof(float),dataSize); // C99 - use correct conversion spec
printf("%Iu and %i",sizeof(*dataInput)/sizeof(float),dataSize); // MSVC - use 'correct' conversion spec