C中的struct和array问题

时间:2011-03-24 08:42:22

标签: c

问题在于:
我有这样的结构:

struct{
    Variable a;
    Variable 2;
    char ch[1];
}

我需要将ch指向包含多个struct数组的另一个char。不,我根本不能改变第一个结构定义。我只需要一些如何将第二个struct的第一个字节放在ch[1]中,而我根本就不知道该怎么做。请帮我。感谢。

6 个答案:

答案 0 :(得分:5)

您不能将数组“指向”其他内容,因为数组不是指针。一个char的数组只是一个数组,您可以在其中存储单个char值。

如果无法将数组中的定义更改为指针,则无法使其成为“点”。我担心这很简单。

答案 1 :(得分:2)

这是C中非常常见的范例。最后一个字符只是可变数据的占位符,实际上你将分配一个更大的缓冲区并超出1个字符。这是完全合法的。

你不能改变结构但是当你调用malloc()来分配它时,你会分配一些额外的字节。

代替char[1]所需的是指针(指向其他结构)。

让我们给你的结构命名:

typedef struct{
    Variable a;
    Variable 2;
    char ch[1];
} Element;
你的代码中的

Element * elt = malloc( sizeof( Element ) + sizeof( CharArrayStruct* ) - 1);
 /* fill your struct */
*(CharArrayStruct **)elt.ch = &myCharArrayStruct;
/* later on reading it back */
CharArrayStruct * pcas = *(CharArrayStruct **)elt.ch;

注意elt.ch是数组开头的地址,而不是char。请注意,其内容为OtherStruct*,因此必须强制转换为CharArrayStruct**

答案 2 :(得分:1)

你可以拿出第三个struct

struct c {
    struct a *a;
    struct b *b;
    struct c *next;
}

每当您想要存储struct astruct b之间的关联时,请将其中的一个添加到头部 - 当您需要查找一个关联时,请沿着链接列表向下走,在.a上进行指针比较,直到找到匹配的比较,并返回.b

当您free() struct a个对象时,不要忘记从链接列表中删除这些条目,并且不要忘记NULL {{1} 1 {} .b free()对象时的成员。

答案 3 :(得分:0)

我认为不可能以安全的方式进行,至少除非你处于低内存环境中。单个字符(这是您的ch字段)仅由1个字节组成;这根本不足以指向虚拟内存空间中的任何内存位置。即使你将char强加给(void *),你也无法用它来解决你绝大部分的记忆。

也许你应该退一步告诉我们你实际上想要完成什么,而不是你认为你需要做什么才能完成它。

答案 4 :(得分:0)

如果你的意思是你在实际问题体中的字面意思(“我只需要一些如何将我的第二个结构的第一个字节放在ch[1]中,而我根本不知道如何做到这一点。” ),我忽略了第一句谈到“指点”,你可以这样做:

struct{
    Variable a;
    Variable 2;
    char ch[1];
} my_struct_that_cant_be_changed;

struct my_other_struct x;

my_struct_that_cant_be_changed.ch[0] = *(char *) &x;

这只是从另一个结构中读取第一个char(在变量x中)并将该值分配给第一个结构的1个字符数组。

请注意,这对我来说似乎毫无意义,但它确实(某种程度上)你想要的东西。

答案 5 :(得分:0)

首先,目前尚不清楚你想做什么。使用单字节值不可能“指向”另一个结构。其次,将第二个结构的第一个字节放在ch [0]中没有做任何其他事情是没有意义的。

构造结构的方式我怀疑它被设计为可变长度struct 。 (其他答案已触及此问题,但它们使用额外的空间来存储指针,而不是整个字符串。)

通过分配一些额外的字节,您将在内存中获得以下布局:

+----
| Variable a
| Variable 2 (sic)
| ch[0]
+------ Extra memory below:
| ch[1]
| ...
| ch[N]
+------

您可以通过以下方式进行分配:

p = malloc(sizeof(Element) + N);

您可以使用p->ch[4]访问ch等元素并访问p->ch字符串。

现在,您可以使用所需的字符串(或其他)填充ch数组。