空指针中的字节数
Number of bytes in void pointer
假设我有一个 C 函数:
Func(void* param);
有没有办法知道参数内容的字节数?
没有。不知道 param
指向什么,就不知道它的大小。
不,这是不可能的。这就是为什么几乎所有将指针作为参数的函数都有一个额外的大小参数。应该是这样的:
void func(void *param, int size);
另请注意,解释 size
参数取决于函数。它可以是字节数、元素数或其他。
这里要记住的重要一点是唯一 param
是内存地址。不多也不少。
有些函数没有使用它。一个例子是 strcpy(char * dest, char * src)
复制一个字符串,但是这个函数假设了两件事。它假定 src
是一个以零结尾的字符串。 strcpy
将从 src
开始读取,直到遇到 '[=17=]'
字符。此外,它假定 dest
指向一个足以容纳字符串的内存位置。
sizeof(*param)
将不起作用。 param
只是指向内存块开始位置的指针。这与使用 sizeof(void)
相同
对于初学者来说,类型 void
是一个不完整的类型,它的字节大小是不确定的。
来自 C 标准(6.2.5 类型)
19 The void type comprises an empty set of values; it is an incomplete
object type that cannot be completed.
然而,如果你有一个其他类型的指针作为函数的参数,例如
T *param
那么在一般情况下,您将再次无法确定引用的实际数据所占用的字节数。
无论指针指向单个对象还是数组的第一个对象,指针都不会保留信息。
例如,如果您有一个这样声明的函数
void f( const char *s );
然后可以为这些不同类型的对象调用例如
char c = 'A';
f( &c );
和
char s[] = "Hello";
f( s );
当然你可以得到数组元素或指针引用的单个对象占用的字节数,例如使用表达式
sizeof( *param )
但是在类型 void *
的情况下,您甚至可能不会这样做,尽管某些编译器有自己的语言扩展,允许对类型 void 应用运算符 sizeof
。在这种情况下,表达式的返回值通常等于 1。
假设我有一个 C 函数:
Func(void* param);
有没有办法知道参数内容的字节数?
没有。不知道 param
指向什么,就不知道它的大小。
不,这是不可能的。这就是为什么几乎所有将指针作为参数的函数都有一个额外的大小参数。应该是这样的:
void func(void *param, int size);
另请注意,解释 size
参数取决于函数。它可以是字节数、元素数或其他。
这里要记住的重要一点是唯一 param
是内存地址。不多也不少。
有些函数没有使用它。一个例子是 strcpy(char * dest, char * src)
复制一个字符串,但是这个函数假设了两件事。它假定 src
是一个以零结尾的字符串。 strcpy
将从 src
开始读取,直到遇到 '[=17=]'
字符。此外,它假定 dest
指向一个足以容纳字符串的内存位置。
sizeof(*param)
将不起作用。 param
只是指向内存块开始位置的指针。这与使用 sizeof(void)
对于初学者来说,类型 void
是一个不完整的类型,它的字节大小是不确定的。
来自 C 标准(6.2.5 类型)
19 The void type comprises an empty set of values; it is an incomplete object type that cannot be completed.
然而,如果你有一个其他类型的指针作为函数的参数,例如
T *param
那么在一般情况下,您将再次无法确定引用的实际数据所占用的字节数。
无论指针指向单个对象还是数组的第一个对象,指针都不会保留信息。
例如,如果您有一个这样声明的函数
void f( const char *s );
然后可以为这些不同类型的对象调用例如
char c = 'A';
f( &c );
和
char s[] = "Hello";
f( s );
当然你可以得到数组元素或指针引用的单个对象占用的字节数,例如使用表达式
sizeof( *param )
但是在类型 void *
的情况下,您甚至可能不会这样做,尽管某些编译器有自己的语言扩展,允许对类型 void 应用运算符 sizeof
。在这种情况下,表达式的返回值通常等于 1。