1

说如果我有两种结构类型:

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;
}

这很好用,但问题是,因为TYPEATYPEB的前 32 位是相同的(两者都是unsigned int),我是否可以将AArray'ga的内容更改为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]而不是 using &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;
}
4

3 回答 3

1

好吧,你可以使用联合

union UNION_AB {
  TYPEA a;
  TYPEB b;
};

UNION_AB* UARRAY[1] = { &ua };
于 2013-10-10T03:25:59.117 回答
1
void change_AArray()
{   
   *AArray[0] = *((TYPEA*) &gb);  //#1
   /* error:
   *(AArray[0]) = (TYPEA) gb;     //#2
   */
}

您可以将 #1 用于您的目的。

如果使用#2,gcc 会报错:
error: conversion to non-scalar type requested

问题是:
- 什么是标量/非标量类型?
- 这个错误信息是什么意思?
- 为什么#2 失败了?

什么是标量/非标量类型?
int、char、指针是标量类型,而结构不是。
在此处查看详细信息,http://herbert.the-little-red-haired-girl.org/en/prgmsc1/docs/part2a.pdf

这个错误信息是什么意思?
如果你在标量和非标量类型之间进行赋值,你会得到这个错误。

为什么#2失败?
对于*(AArray[0]) = (TYPEA) gb;,两边都是非标量类型。因此,看起来它不应该出现上述错误。
但是,C 不允许在结构之间进行强制转换。请参阅http://msdn.microsoft.com/en-us/library/d9f2bsy2.aspx

一个测试程序,

struct a{ int i;};
struct b{ int i; };

int main (int argc, char *argv[])
{
    struct a aaa;
    struct b bbb;
    bbb = (struct b)aaa;

    return 0;
}

gcc 报错: error: conversion to non-scalar type requested

总而言之,#2 失败的原因是 C 语言不允许结构之间的转换。

于 2013-10-10T04:14:51.567 回答
0

您不能struct直接转换两种不同类型的,您必须像这样分配字段:

(*AArray[0]).a = gb.a;
于 2013-10-10T03:16:52.000 回答