我对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);
}
答案 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)
个字节。