假设我有一个C函数:
Func(void* param);
有没有办法知道param内容的字节数?
答案 0 :(得分:4)
不,这是不可能的。这就是为什么几乎所有将指针作为参数的函数都有一个额外的大小参数。它应该是这样的:
void func(void *param, int size);
另请注意,由size
参数解释是由函数决定的。它可以是字节数,元素数或其他。
这里要记住的重要事情是param
唯一的东西,是内存地址。没什么,没什么。
某些功能不使用此功能。一个例子是复制字符串的strcpy(char * dest, char * src)
,但是这个函数假设了两件事。它假定src
是一个以零结尾的字符串。 strcpy
将从src
开始读取,直到遇到'\0'
个字符。此外,它假设dest
指向一个足以容纳字符串的内存位置。
sizeof(*param)
无效。 param
只是指向内存块开始位置的指针。它与使用sizeof(void)
答案 1 :(得分:2)
对于初学者,类型void
是一个不完整的类型,其大小(以字节为单位)是不确定的。
来自C标准(6.2.5类型)
19 void类型包含一组空值;这是不完整的 无法完成的对象类型。
但是,如果你有一个其他类型的指针作为函数的参数,例如
T *param
然后在一般情况下,您将再次无法确定引用的实际数据占用的字节数。
指针不会保留信息,无论它们指向单个对象还是数组的第一个对象。
例如,如果你有一个像这样声明的函数
void f( const char *s );
然后可以为不同类型的这些对象调用它
char c = 'A';
f( &c );
和
char s[] = "Hello";
f( s );
当然,您可以获取数组元素或指针引用的单个对象占用的字节数,例如使用表达式
sizeof( *param )
但是在void *
类型的情况下,你可能不会这样做,尽管有些编译器有自己的语言扩展,允许将操作符sizeof
应用于void类型。在这种情况下,表达式的返回值通常等于1.
答案 2 :(得分:1)
没有。在不知道param
指向的内容的情况下,您无法知道它的大小。