通过将struct的地址指向其他类型的struct来获取临时[-fpermissive]的地址

时间:2014-05-20 11:39:38

标签: c pointers struct

我定义了两个不同的typedef结构:datatype_2d_1和datatype_2d_2,它们都基本上有两个双数作为成员,但它们的定义不同。现在我有一个变量数据类型z1和一个指针datatype_2d_2 * z2,我希望z2指向z1的成员。由于连接两个不同的库数据类型而产生问题。

我的代码如下:

// ** test3.cpp **

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

typedef struct {
    double dat[2];
} datatype_2d_1;

typedef struct {
    double real;
    double imag;
} datatype_2d_2;

int main(){


        datatype_2d_1 z1={{1.1,2.1}};
        datatype_2d_2 *z2;

        z2=( &(datatype_2d_2) {.real=z1.dat[0],.imag=z1.dat[1]} );

        printf("\n\nz1.dat[0]=%lf\tz1.dat[1]=%lf\n",(z1).dat[0],(z1).dat[1]);
        printf("(*z2).real=%lf\t(*z2).imag=%lf\n",z2->real,z2->imag);
        return 0;
}

使用g++ test3.cpp -o test3

进行编译时

我收到错误:

获取临时[-fpermissive]

的地址

2 个答案:

答案 0 :(得分:0)

试试这个:

datatype_2d_2 tmp = { .real = z1.dat[0], .imag = z1.dat[1] };
z2 = &tmp;

如果你想让z2指向z1,你可以试试这个:

 z2 = (datatype_2d_2*)&z1;

答案 1 :(得分:0)

由于您的结构具有相同的内存布局,因此您可以使z2只是指向z1的指针。

datatype_2d_1 z1={{1.1,2.1}};
datatype_2d_2 *z2;

z2 = (datatype_2d_2*)&z1;

printf("nz1.dat[0]=%lf\tz1.dat[1]=%lf\n",(z1).dat[0],(z1).dat[1]);
printf("(*z2).real=%lf\t(*z2).imag=%lf\n",z2->real,z2->imag);

或者,如果您可以使用联合,那么您始终可以使用以下任一格式访问相同的数据:

union data_both
{
    datatype_2d_1 a;
    datatype_2d_2 b;
};

datatype_2d_1 z1={{3.1,4.1}};

data_both both;

both.a = z1;

printf("both.a.dat[0]=%lf\tz1.dat[1]=%lf\n",both.a.dat[0],both.a.dat[1]);
printf("both.b.real=%lf\tboth.b.imag=%lf\n",both.b.real,both.b.imag);