Char size and const void*
Char size and const void*
我有一个关于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
字节。
相关文章:
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 从"const void*"到"PVOID {aka void*}"[-fall
- 将返回类型专用化为 void 或 const 左值引用
- 不能使这种类型的"void(C::* volatile)(int) const "在参考手册C++示
- 错误:对类型 'const ItemInstance' 的引用无法绑定到类型 'void' 的右值
- 错误:从'void*'到'const uint8_t* {aka const unsigned char*}'的转换无效 [-允许]
- template<class T, int N> void h(T const(&)[N]); as friend function
- 'void (*)(const char*)' 'void (*)()' [-允许]
- 从 'void *' 转换为 'const std::string *&' 必须具有所有中间指针 const 合格
- Python ctypes and void const pointers
- Casting a const void*
- SFML 和 Box2D SetUserData 无法将参数从 const char [4] 转换为 void *
- 警告:'virtual void wxWindowBase::SetInitialBaseSize(const wxSize&)'已弃用
- typedef void (*print_type) (const char*);
- :void setData(const Color * & data_ptr)中的 *& 是什么意思;
- 将所有权从 unique_ptr<T,void(*)(T*)> 转移到 unique_ptr<const T,void(*)(const T*>
- 使用 LLVM 从 const void * 转换为模板类型时出现问题
- 将 std::function 作为参数传递,const void *
- 了解 void f(const T¶m) 中的参数类型
- CA::release_objects(X::List<void const*>*)