我有以下“测试代码”:
#include <stdlib.h>
#include <stdio.h>
...
struct data{
char *name;
void *value;
};
struct g_arg{
char *info1;
char *info2;
int info3;
};
int main()
{
char *some_info = "information to store in g";
struct g_arg g;
struct data d[] = {
{"info1=", &g.info1},
{"info2=", &g.info2},
{"info3=", &g.info3},
{NULL, NULL},
};
...
}
我想在g struct元素中插入一个值,通过d struct传递。例如,我想做这样的事情:
d[0].value = some_info;
执行此指令后,g.info1应包含字符串some_info。
这只是一个示例代码。我必须在复杂的程序中做类似的事情。我搜索了这样的其他问题,但我没有找到解决方案。
谢谢你们所有人。我取得了一些进展,但问题还没有解决。我会试着解释一下。 现在,如果我这样做:
printf( "content of g.info1: %s", (char*)(d[0].value) );
我可以通过访问d结构来阅读g.info
的内容。但我需要在g.info
中写一些内容,在d[i].value
中写一些内容。
答案 0 :(得分:0)
你的g_arg指针info1和info2需要绑定到一些内存才能分配给后者。
由于这些是指针,你不能将一个字符串分配给另一个字符串,所以请使用strcpy之类的东西。
另外,如果你知道大小,你可以将info1和info2作为char数组,而不必为它们动态分配内存。
答案 1 :(得分:0)
答案 2 :(得分:0)
在您的代码中,g.info1
的类型为char *
,因此&g.info1
的类型为char **
。您当然可以将其分配给void *
的{{1}}元素value
,但它是(可能)字符串的指针,而不是字符串本身。
此外,结果是指向堆栈分配指针的指针。如果此指针值在函数结束后仍然存在,那么它将不再有效,并且任何取消引用它的尝试都将产生未定义的行为。
如果要将字符串值复制到数组struct data
的元素中而不是像现在这样分配指针,那么必须首先要复制字符串。在这种情况下,您可以使用d
分配空间并一步复制字符串:
strdup()
请注意,在这种情况下,struct g_arg g = { "info 1", "info 2", 42 };
struct data d[] = {
{"info1=", NULL},
{"info2=", NULL},
{"info3=", NULL},
{NULL, NULL},
};
d[0].value = strdup(g.info1);
d[1].value = strdup(g.info2);
d[2].value = malloc(sizeof(int));
*((int *) d[2].value) = g.info3;
元素的value
成员中记录的所有结果指针都是指动态分配的内存。这允许它们在函数退出之后保持有效,但它要求程序稍后d
以避免泄漏内存。
答案 3 :(得分:0)
wrt to d[0].value = some_info;
如果some_info已经是struct g_arg
类型的对象,其成员info1
已经设置为字符串,那么这在理论上是可行的。
但似乎您希望some_info
成为字符串(char *
,C样式);
因此,您需要引用info1
的{{1}}成员。因此,您需要将d[0].value
转换为相应的数据类型void*
,然后访问成员(struct g_arg *)(d[0].value)
,如下所示:info1
。
由于info1是char *,您应该使用((struct g_arg *)(d[0].value))->info1
将字符串复制到适当分配的缓冲区中,或者在复制之前手动为字符串分配内存。你最终得到了这个:
strdup()
当你完成时,请记住((struct g_arg *)(d[0].value))->info1 = strdup(some_info);
记忆。