![](/img/trans.png)
[英]In C, how can I initialize all elements in an array of pointers within a structure to null?
[英]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数组,而不必为它们动态分配内存。
在您的代码中, g.info1
类型为char *
,所以&g.info1
类型为char **
。 您当然可以将其分配给struct data
的void *
元素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].value
的info1
成员。 因此,您需要将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.