如何在函数中打印 void * 以及如何在函数中访问 void * 变量?
How to print the void * in a function and how to access the void * variable in a function?
我试图将一个函数作为参数传递给另一个带有 void
指针的函数,但它不起作用
#include "header.h"
void print ( void *Arg )
{
// while ( ( int *) Arg[0] )
{
printf ( "Arg[0] = %d Arg[1] = %d\n",(int *) Arg[0], (int * ) Arg[1] );
sleep ( 1 );
//Arg[0]--;
//Arg[1]--;
}
}
void main(int argc, char **argv)
{
int count[2] = { 10, 160};
print (count);
}
我收到这样的错误:
void*.c: In function ‘print’:
void*.c:6:52: warning: dereferencing ‘void *’ pointer [enabled by default]
printf ( "Arg[0] = %d Arg[1] = %d\n",(int *) Arg[0], (int * ) Arg[1] );
^
void*.c:6:3: error: invalid use of void expression
printf ( "Arg[0] = %d Arg[1] = %d\n",(int *) Arg[0], (int * ) Arg[1] );
^
void*.c:6:69: warning: dereferencing ‘void *’ pointer [enabled by default]
printf ( "Arg[0] = %d Arg[1] = %d\n",(int *) Arg[0], (int * ) Arg[1] );
^
void*.c:6:3: error: invalid use of void expression
printf ( "Arg[0] = %d Arg[1] = %d\n",(int *) Arg[0], (int * ) Arg[1] );
我该如何解决这个问题?
数组下标运算符(解除引用)可用于完整类型。 void *
不是您可以取消引用的完整类型。
要完成此操作,您需要 cast
将 Arg
本身转换为 int *
,然后使用取消引用运算符来获取值。
此外,要打印指针,您需要使用 %p
格式说明符。
要打印指针,您需要 "%p"
printf
格式。
但似乎您实际上并不想打印实际指针,而是它指向,这就是您的错误来源,因为您的转换是错误的地方,你需要在取消引用之前转换指针,例如
((int *) Arg)[0]
operator precedence 存在问题,其中数组下标运算符的优先级高于类型转换运算符。所以编译器认为你在做 (int *) (Arg[0])
.
也许可以这样试试
printf ( "Arg[0] = %d Arg[1] = %d\n",((int *)Arg)[0], ((int * )Arg)[1] );
代码的问题在于 printf 中使用的下标运算符,例如 Arg[0]
或 Arg[1]
应用于 void *
.[=16= 类型的指针]
您必须首先将此指针转换为 int *
类型,然后才应用下标运算符
void print ( void *Arg )
{
// while ( ( int *) Arg[0] )
{
printf ( "Arg[0] = %d Arg[1] = %d\n", ( (int *) Arg )[0], ( (int * ) Arg )[1] );
sleep ( 1 );
//Arg[0]--;
//Arg[1]--;
}
}
或者如果在函数的开头定义一个本地指针,代码会更简单。例如
void print ( void *Arg )
{
int *p = Arg;
// while ( ( int *) Arg[0] )
{
printf ( "Arg[0] = %d Arg[1] = %d\n", p[0], p[1] );
sleep ( 1 );
//Arg[0]--;
//Arg[1]--;
}
}
我试图将一个函数作为参数传递给另一个带有 void
指针的函数,但它不起作用
#include "header.h"
void print ( void *Arg )
{
// while ( ( int *) Arg[0] )
{
printf ( "Arg[0] = %d Arg[1] = %d\n",(int *) Arg[0], (int * ) Arg[1] );
sleep ( 1 );
//Arg[0]--;
//Arg[1]--;
}
}
void main(int argc, char **argv)
{
int count[2] = { 10, 160};
print (count);
}
我收到这样的错误:
void*.c: In function ‘print’:
void*.c:6:52: warning: dereferencing ‘void *’ pointer [enabled by default]
printf ( "Arg[0] = %d Arg[1] = %d\n",(int *) Arg[0], (int * ) Arg[1] );
^
void*.c:6:3: error: invalid use of void expression
printf ( "Arg[0] = %d Arg[1] = %d\n",(int *) Arg[0], (int * ) Arg[1] );
^
void*.c:6:69: warning: dereferencing ‘void *’ pointer [enabled by default]
printf ( "Arg[0] = %d Arg[1] = %d\n",(int *) Arg[0], (int * ) Arg[1] );
^
void*.c:6:3: error: invalid use of void expression
printf ( "Arg[0] = %d Arg[1] = %d\n",(int *) Arg[0], (int * ) Arg[1] );
我该如何解决这个问题?
数组下标运算符(解除引用)可用于完整类型。 void *
不是您可以取消引用的完整类型。
要完成此操作,您需要 cast
将 Arg
本身转换为 int *
,然后使用取消引用运算符来获取值。
此外,要打印指针,您需要使用 %p
格式说明符。
要打印指针,您需要 "%p"
printf
格式。
但似乎您实际上并不想打印实际指针,而是它指向,这就是您的错误来源,因为您的转换是错误的地方,你需要在取消引用之前转换指针,例如
((int *) Arg)[0]
operator precedence 存在问题,其中数组下标运算符的优先级高于类型转换运算符。所以编译器认为你在做 (int *) (Arg[0])
.
也许可以这样试试
printf ( "Arg[0] = %d Arg[1] = %d\n",((int *)Arg)[0], ((int * )Arg)[1] );
代码的问题在于 printf 中使用的下标运算符,例如 Arg[0]
或 Arg[1]
应用于 void *
.[=16= 类型的指针]
您必须首先将此指针转换为 int *
类型,然后才应用下标运算符
void print ( void *Arg )
{
// while ( ( int *) Arg[0] )
{
printf ( "Arg[0] = %d Arg[1] = %d\n", ( (int *) Arg )[0], ( (int * ) Arg )[1] );
sleep ( 1 );
//Arg[0]--;
//Arg[1]--;
}
}
或者如果在函数的开头定义一个本地指针,代码会更简单。例如
void print ( void *Arg )
{
int *p = Arg;
// while ( ( int *) Arg[0] )
{
printf ( "Arg[0] = %d Arg[1] = %d\n", p[0], p[1] );
sleep ( 1 );
//Arg[0]--;
//Arg[1]--;
}
}