【发布时间】:2013-10-17 15:48:51
【问题描述】:
如果我有两种结构类型:
typedef struct
{
unsigned int * a;
char * b;
char * c;
}TYPEA;
typedef struct
{
unsigned int * a;
unsigned int * b;
}TYPEB;
我还有一个指针数组,其中包含指向TYPEA类型的指针:
TYPEA* AArray[1] =
{
&ga,
};
ga 定义为:
TYPEA ga =
{
&num1,
&b,
&c,
};
如果我定义了另一个TYPEA var,我可以修改AArray[0] 的内容值,如下所示:
TYPEA another_ga =
{
&num3,
&b,
&c,
};
void change_AArray()
{
*AArray[0] = another_ga;
}
这很好用,但问题是,TYPEA 和 TYPEB 的前 32 位相同(两者都是 unsigned int)我是否可以更改 AArray 的 ga' s 内容到TYPEB 结构?
这是我的尝试:
void change_AArray()
{
/* *AArray[0] = another_ga; */
/* Compile Error */
/* *AArray[0] = gb; */
/* Compile Error */
/* *AArray[0] = (TYPEA)gb; */
/* Passed compile, but AArray[0] is not changed */
/* AArray[0] = (TYPEA*)&gb; */
}
然后我尝试添加另一个指针并将其放入AArray[0]而不是使用&ga,但它无法通过编译阶段,我认为C在初始化列表中需要一个常量。
TYPEA * pga = &ga;
TYPEA* AArray[1] =
{
pga, // error, needs a constant expression.
};
void change_AArray()
{
AArray[0] = (TYPEA*)&gb;
}
是否可以进行类型转换?
整个代码:
#include <stdio.h>
typedef struct
{
unsigned int * a;
char * b;
char * c;
}TYPEA;
typedef struct
{
unsigned int * a;
unsigned int * b;
}TYPEB;
int num1 = 10, num2 = 20, num3 = 30;
char b = 'b', c = 'c';
TYPEA ga =
{
&num1,
&b,
&c,
};
TYPEA another_ga =
{
&num3,
&b,
&c,
};
TYPEB gb =
{
&num2,
&num3,
};
TYPEA* AArray[1] =
{
&ga,
};
void change_AArray()
{
*AArray[0] = another_ga;
/* How can I do this conversion? */
/* *AArray[0] = gb; */
}
int main(int argc, const char *argv[])
{
printf("ga.a: %d\n", *ga.a);
printf("gb.b: %d\n", *gb.a);
change_AArray();
printf("After calling change_AArray()\n");
printf("ga.a: %d\n", *ga.a);
printf("gb.b: %d\n", *gb.a);
return 0;
}
【问题讨论】:
标签: c pointers struct type-conversion