如何使用指针构造元素?

时间:2015-01-30 18:38:36

标签: c

我有以下“测试代码”:

#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中写一些内容。

4 个答案:

答案 0 :(得分:0)

你的g_arg指针info1和info2需要绑定到一些内存才能分配给后者。

由于这些是指针,你不能将一个字符串分配给另一个字符串,所以请使用strcpy之类的东西。

另外,如果你知道大小,你可以将info1和info2作为char数组,而不必为它们动态分配内存。

答案 1 :(得分:0)

要点1.使用malloc() [或家庭]将内存分配给g.info1

第2点。使用strcpy()将数据复制到d[0].value

第3点。您不需要使用&g.info1g.info1就足够了。

答案 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);记忆。