繁体   English   中英

如何使用指向结构元素的指针?

[英]How can I use pointers to structure elements?

我有以下“测试代码”:

#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},
  };

  ...

}

我想通过d结构在g结构元素中插入一个值。 例如,我想做这样的事情:

d[0].value = some_info;

执行该指令后,g.info1应该包含字符串some_info。

这只是一个示例代码。 我必须在复杂的程序中做类似的事情。 我搜索了其他类似问题,但没有找到解决方案。


谢谢大家。 我取得了一些进展,但问题尚未解决。 我会尝试解释得更好。 现在,如果我这样做:

printf( "content of g.info1: %s", (char*)(d[0].value) );

我可以通过访问d结构来读取g.info的内容。 但是我需要通过在d[i].value “编写”某些内容来在g.info编写内容。

您的g_arg指针info1和info2需要绑定到一些内存,以便以后可以分配给它们。

由于这些是指针,因此您无法将一个字符串分配给另一个字符串,因此请使用诸如strcpy之类的东西。

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

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

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

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

在您的代码中, g.info1类型为char * ,所以&g.info1类型为char ** 您当然可以将其分配给struct datavoid *元素value ,但这是指向 (也许)字符串的指针 ,而不是字符串本身。

此外,结果是指向堆栈分配指针的指针。 如果该指针值在函数结束后仍然存在,则它将不再有效,并且任何对其进行取消引用的尝试都将产生未定义的行为。

如果要将字符串值复制到数组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;

请注意,在这种情况下,记录在d元素的value成员中的所有结果指针均指的是动态分配的内存。 这使它们在函数退出后仍保持有效,但是它要求程序稍后free()它们以避免内存泄漏。

wrt到d[0].value = some_info; 如果some_info已经是struct g_arg类型的对象(其成员info1已设置为字符串),则从理论上讲这是struct g_arg的。

但是似乎您希望some_info是一个字符串( char * ,C风格);

因此,您需要引用d[0].valueinfo1成员。 因此,您需要将void* (struct g_arg *)(d[0].value)转换为适当的数据类型(struct g_arg *)(d[0].value) ,然后像这样访问成员info1((struct g_arg *)(d[0].value))->info1

由于info1是一个char *,因此应使用strdup()将字符串复制到适当分配的缓冲区中,或者在复制之前为该字符串手动分配内存。 您最终得到以下结果:

((struct g_arg *)(d[0].value))->info1 = strdup(some_info);

完成后,请记住free()内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM