Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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 - Fatal编程技术网

C 无法转换为指针类型,正在强制转换结构

C 无法转换为指针类型,正在强制转换结构,c,pointers,C,Pointers,在将结构强制转换为指针时,我遇到一个无法转换为指针类型的错误 我试图将ObjectExtended类型的结构强制转换为ObjectBase的指针,ObjectExtended的第一个成员是指向ObjectBase的指针,因此它应该可以工作 代码如下: typedef struct ObjectBase { int integer1; int integer2; }ObjectBase; typedef struct ObjectExtended { ObjectBase

在将结构强制转换为指针时,我遇到一个无法转换为指针类型的错误

我试图将ObjectExtended类型的结构强制转换为ObjectBase的指针,ObjectExtended的第一个成员是指向ObjectBase的指针,因此它应该可以工作

代码如下:

typedef struct ObjectBase
{
    int integer1;
    int integer2;
}ObjectBase;

typedef struct ObjectExtended
{
    ObjectBase* baseObj;
    char* string;
}ObjectExtended;

int main(int argc,char** argv)
{
    ObjectExtended* objExtended = malloc(sizeof(ObjectExtended));
    objExtended->string = "TEST_OBJECT";

    objExtended->baseObj = malloc(sizeof(ObjectBase));
    objExtended->baseObj->integer1 = 10;
    objExtended->baseObj->integer2 = 11;

    printf("Extended Object:\n");
    printf("\tString: %s\n",objExtended->string);
    printf("\tInt1: %i\n",objExtended->baseObj->integer1);
    printf("\tInt2: %i\n",objExtended->baseObj->integer2);

    ObjectBase* objBase = (ObjectBase*)(*objExtended);
    printf("Base Object:\n");
    printf("\tInt1: %i\n",objBase->integer1);
    printf("\tInt2: %i\n",objBase->integer2);

    free(objExtended->baseObj);
    free(objExtended);
    return 0;
}
应该是

    ObjectBase* objBase = (ObjectBase*)objExtended;

我想。您不需要取消对ObjectExtended的引用。

似乎您希望ObjectExtended的ObjectBase组件。只需使用字段的名称

ObjectBase* objBase = objExtended->baseObj;
这只是另一种拼写

ObjectBase* objBase = (*objExtended).baseObj;
对于像casting这样的对象,它不是在C中定义的,在cast中只允许使用标量类型,您不应该试图欺骗C的类型系统。

将代码更改为

  ObjectBase* objBase = (ObjectBase *)objExtended; //Compiles and running, but gives wrong answer.
要得到正确答案,你可以写

 ObjectBase* objBase = (ObjectBase *)objExtended->baseObj;


可以说,必须将结构本身作为派生类的第一个成员,而不是指向它的指针。这是正确的:不能将结构强制转换为指针ObjectBase*objBase=ObjectBase**OBJEXTEND;。它们不是一回事。但是,您可以这样做:ObjectBase*objBase=ObjectBase*objExtended;如果ObjectExtended中指向ObjectBase的指针不是pointerBut,我应该能够将它转换为它的第一个成员,或者我错了吗?@Helios41:您可以将结构指针转换为指向它的第一个成员的指针。@Helios41,您可以,只要你能始终保证它是第一个会员。但该属性很难维护,casting取消了所有可能的类型检查。只使用定义好的struct字段,并可能施加一些命名约定,这对于您和编译器来说都更容易检查。
 ObjectBase* objBase = (ObjectBase *)objExtended->baseObj;
 ObjectBase* objBase = objExtended->baseObj;