字符大小和const void *

时间:2014-07-09 15:36:12

标签: c++ c

我对const void *中的数据大小有疑问。在下面的代码中,第一个printf的输出是6,而第二个printf的输出是3.请帮助,我找不到问题的来源。提前谢谢

#define TEST "\x00\x01\x02\x03\x04\x05"

#include <stdio.h>

static void function(const void* c);

int main (void) {

    printf("TEST: %d\n",sizeof(TEST) -1);
    function(TEST);

    return 0;
}

static void function(const void* c) {
    printf("TEST: %d\n",sizeof(c) -1);
}

2 个答案:

答案 0 :(得分:5)

在第一种情况下,sizeof(TEST)是字符串文字的大小,它是一个足以包含所有字符加上终结符的数组 - 在本例中为7个字节。

在第二种情况下,sizeof(c)是32位平台上指针的大小--4个字节。

通常,只有指向它的指针才能告诉数组的大小。如果它指向C风格的终止字符串,则可以使用strlen(c)来衡量长度。但是,在这种情况下,它包含一个空字符,因此无法确定长度。

在C ++中,您可以使用模板而不是sizeof来获取数组的大小:

template<typename T, size_t N> size_t array_size(T(&)[N]) {return N;}

这样做的好处是,如果您不小心将其应用于指针而不是数组,那么您将获得编译时错误,而不是意外的运行时结果。

答案 1 :(得分:1)

sizeof运算符返回类型名称或表达式相对于sizeof(char)的字节数。具有以下语法:

sizeof unary-expression 
sizeof ( type-name ) 

如果它是一个一元表达式并且它是一个像你sizeof(TEST)这样的字符串文字,它会返回该字符串中的字节数,包括null-byte-terminattor。但如果它是2*p之类的表达式,其结果类型为int,则表达式在编译时进行评估(没有任何副作用)和结果类型的大小({{1 } {}返回,为int

或者,如果它sizeof(int)喜欢你的type-name,它会返回此类型的平台无关字节数。例如,32位机器上的sizeof(c)sizeof(int)个字节。