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