问题在于:
我有这样的结构:
struct{
Variable a;
Variable 2;
char ch[1];
}
我需要将ch
指向包含多个struct
数组的另一个char
。不,我根本不能改变第一个结构定义。我只需要一些如何将第二个struct
的第一个字节放在ch[1]
中,而我根本就不知道该怎么做。请帮我。感谢。
答案 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 a
与struct 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
数组。