union
Eric のコメントに基づいて、複雑な構造体を返すためにan を使用する次のコードを思いつきました。この場合、前述の「エイリアシング ルール」エラーは発生しません。
struct Result {
int type;
};
struct Data1
{
int type;
char* str;
int val;
};
struct Data2 {
int type;
int arr[4];
};
union StructTestUnion
{
struct Result res;
struct Data1 data1;
struct Data2 data2;
};
union StructTestUnion getRandomResult(void) {
static int cnt = 0;
union StructTestUnion resVal;
switch (cnt) {
case 0:
resVal.data1.type = 1;
resVal.data1.str = "struct data 1";
resVal.data1.val = 123;
break;
case 1:
resVal.data2.type = 2;
resVal.data2.arr[0]=1;
resVal.data2.arr[1]=2;
resVal.data2.arr[2]=3;
resVal.data2.arr[3]=4;
break;
}
cnt++;
if (cnt==2) cnt = 0;
return resVal;
}
int main() {
union StructTestUnion resVal;
int a =0;
for (a =0; a<4; a++) {
resVal = getRandomResult();
printf("%d: %d ", a, resVal.res.type);
switch ( resVal.res.type ) {
case 1:
printf("str=[%s] val=[%d]\n", resVal.data1.str, resVal.data1.val);
break;
case 2:
printf("arr=[%d,%d,%d,%d]\n",resVal.data2.arr[0], resVal.data2.arr[1],resVal.data2.arr[2], resVal.data2.arr[3]);
break;
}
}
return 0;
}