有人可以解释一下吗?

时间:2014-01-21 18:27:31

标签: c printf sizeof

我真的不明白这一点。也许有人可以解释我。 我想知道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

3 个答案:

答案 0 :(得分:4)

这是错误的格式说明符:

printf("%i and %i",sizeof(*dataInput)/sizeof(float),dataSize);
        ^^

sizeof返回{em> unsigned 的size_t类型,在Visual Studio中正确的格式说明符为%zu%Iu

使用错误的格式说明符会调用undefined behavior,但这似乎无法解释10dataSize的输出没有意义,因为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_tsizeof的结果类型)。

在这种情况下

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