单指针指向c中的两个不同的const结构表(查找表)

时间:2011-12-12 06:09:56

标签: c pointers struct

我有两个不同的结构和两个const查找表,如下所示

typedef const struct 
{
    unsigned int  num;
    unsigned char name[100];
    unsigned int value1;
    unsigned int value2;
    unsigned int value3;
}st_Table1;

typedef const struct
{
    unsigned int  num;
    unsigned char name[100];
}st_Table2;

st_Table1 stTable1[] =
{
    { 1, "Name1", 12, 13, 14 },
    { 2, "Name2", 22, 23, 24 },
    { 3, "Name3", 32, 33, 34 },
    { 4, "Name4", 42, 43, 44 }
};



st_Table2 stTable2[] =
    { 1, "India1" },
    { 2, "India2" },
    { 3, "India3" }
};

是否可以使用指向查找表stTable1stTable2的单个指针?

当我必须决定选择两个表中的任何一个时,我们可以分配表的地址(任一个)。

但之后我想在剩下的代码中使用单个指针。

请回复任何逻辑...提示......线索

Arvind的

5 个答案:

答案 0 :(得分:0)

你可以创建一个结构

typedef struct _tableChoice 
{
  st_Table1* table1;
  st_Table2* table2;

} tableChoice_t,*p_tableChoice_t;

然后您可以传递类型p_tableChoice_t的参数,直到您需要专门访问其中一个表。如果您需要在运行时决定使用哪个指针,则需要在决策点处提供两个指针。

答案 1 :(得分:0)

你可以获得与其他联盟建议的演员阵容相同的效果

union table_ptr {
   st_Table1*table1;
   st_Table2*table2;
} my_table_ptr;

并只分配/访问所需的成员。

答案 2 :(得分:-1)

您可以创建一个无效指针:

void * ptr;

与任何其他指针一样,它可以指向任何内存地址,但它没有指定存储在那里的数据类型,所以你可以取消引用它,但你必须依赖于你自己的知道访问不同元素的结构等。如果你有一些其他标志指示它指向的记录类型,你可以将它转换回所需类型的指针。

鉴于你的两个结构都有共同点,你最好只使用第一个结构并接受内存上的小开销用于只需要numname的情况。我讨厌软件膨胀和浪费内存,但是你在谈论额外的12个字节(在大多数平台上),不需要value1-3的记录,所以除非我们谈论数十亿条记录,否则机会是多余的代码需要处理更多内存会比浪费的空间消耗更多的内存。

另一个选项可能是一个联合,你可以从name丢失12个字节以获取第二个类型的记录,这样所有记录占用的空间都相同,但当然编译器填充会对某些记录产生影响。平台。

答案 3 :(得分:-1)

您可能希望遵循与sockaddr系列结构类似的模式。在该设置中,所有结构必须具有相同的大小和相同的初始布局,例如:

typedef const struct
{
    unsigned int  num;
    unsigned char name[100];
    char buffer_[sizeof(unsigned int) * 3];
} st_TableBase;

typedef const struct 
{
    unsigned int  num;
    unsigned char name[100];
    unsigned int value1;
    unsigned int value2;
    unsigned int value3;
} st_Table1;

typedef const struct
{
    unsigned int  num;
    unsigned char name[100];
    char buffer_[sizeof(unsigned int) * 3];
} st_Table2;

使用此结构,您通常会维护一个类型为st_TableBase的指针。使用此指针,您将能够直接访问num或name成员,因为所有类型都具有一致的初始布局。如果您需要访问其他字段,可以将st_TableBase转换为“派生”类型之一。

有关sockaddr结构的详细信息,请参阅http://www.retran.com/beej/sockaddr_inman.html

答案 4 :(得分:-1)

这是不可能的。指针必须知道自己的范围才能在运行时正确读取和写入,或者您无法对其执行任何操作。如果您不知道它是table1还是table2,您如何编写代码来读取它? (valuevalue = *pointer;的类型是什么?)另一方面,如果你知道它是table1 / table2,为什么不使用特定类型的指针?

或(如果你坚持的话)

只需使用st_Table1作为st_Table2并接受每个记录的内存浪费(3 * sizeof(unsigned int))。除非你有数十亿的记录,否则这不会是一个很大的浪费。您不希望通过C结构保存数十亿的数据记录。

或者(好吧,你讨厌浪费)

typedef struct
{
    int num;
    char name[100];
    int *value;
}st_table;
嗯,你现在有一个统一的结构。如果需要,可在运行时分配valuevalue = (int *)malloc(3 * sizeof(int));)。在阅读value之前,请不要忘记NULL检查。