Char size and const void*

Char size and const void*

本文关键字:void const and size Char      更新时间:2023-10-16

我有一个关于const void*中数据大小的问题。在下面的代码中,第一次printf的输出是6,而第二次printf的输出是3。请帮忙,我找不到问题是从哪里来的。提前谢谢你

#define TEST "x00x01x02x03x04x05"
#include <stdio.h>
static void function(const void* c);
int main (void) {
    printf("TEST: %dn",sizeof(TEST) -1);
    function(TEST);
    return 0;
}
static void function(const void* c) {
    printf("TEST: %dn",sizeof(c) -1);
}

在第一种情况下,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;}

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

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

sizeof unary-expression 
sizeof ( type-name ) 

如果它是一个一元表达式,并且它是一个字符串字面值,如sizeof(TEST),它返回该字符串中的字节数,包括空字节终止符。但是,如果它是像2*p这样具有int结果类型的表达式,则在编译时对该表达式求值(没有任何副作用),并返回结果类型(int)的大小,如sizeof(int)

或者如果它是type-name,就像你的sizeof(c)一样,它返回该类型的平台无关的字节数。例如,32位机器上的sizeof(int)4字节。