Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为C中的结构指定字节指针_C_Pointers_Reference_Variable Assignment_Dereference - Fatal编程技术网

为C中的结构指定字节指针

为C中的结构指定字节指针,c,pointers,reference,variable-assignment,dereference,C,Pointers,Reference,Variable Assignment,Dereference,这个问题让我很恼火,但我想避免使用memcpy这种显而易见的解决方案 struct Person { //Some variables }; void doSomething(char* pointerToSomeone) { struct Person bob; //Assign pointerToSomeone to bob, somehow... } 在上面的例子中,pointerToSomeone是指向Person结构的指针。 我该如何分配给鲍勃?当然有可能

这个问题让我很恼火,但我想避免使用memcpy这种显而易见的解决方案

struct Person
{
    //Some variables
};

void doSomething(char* pointerToSomeone)
{
    struct Person bob;

    //Assign pointerToSomeone to bob, somehow...
}
在上面的例子中,pointerToSomeone是指向Person结构的指针。 我该如何分配给鲍勃?当然有可能


我已经尝试了很多我认为是合理的强制转换、遵从等,但没有成功(编译器错误)。

你不能。但是,如果确定
指针tosomeone
确实是指向
人的指针,则可以将
bob
作为指针并使用类型转换:

struct Person *bob = (struct Person *) pointerToSomeone;

不能将指向
char
的指针指定给
struct
,但可以将
char*
指向的内容复制到
struct
中,如下所示:

memcpy(&bob, pointerToSomeone, sizeof(struct Person));

如果
指针tosomeone
是非类型化的,更常见的做法是使用
void*
而不是
char*

,只需将
指针tosomeone
指向的结构复制到
bob
,并使用
memcpy
,只需确保指针tosomeone确实是指向结构人的指针

void doSomething(char* pointerToSomeone)
{
    struct Person bob;

    memcpy( &bob , pointerToSomeone , sizeof( struct Person ) ) ;

}
您可以简单地这样做(假设它是有效的强制转换):

请注意,您正在复制指针堆栈,而不是像这样引用它:

struct Person* bob = (struct Person*) pointerToSomeone;

如果这会改变指针tosomeone的大小,那么应该使用**而不是*。首先,如果指针tosomeone确实指向一个人,为什么会声明为“char*”?它应该是指向结构的指针,否则为void*。第二,你所说的“分配给鲍勃”实际上是什么意思?你的意思是指向bob结构吗?这只是“pointerToSomeone=&bob”,它对函数的作用域有效(但不在函数的作用域之外)。你的意思是要将数据从一个结构复制到另一个结构吗?这需要memmove()。那你到底想干什么?宾果。我知道用我现在的方式使用局部变量是毫无意义的!
struct Person* bob = (struct Person*) pointerToSomeone;