空指针中的字节数

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。