簡體   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