![](/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.