2

私のアプリケーションには構造体があります:

struct
{
  gchar *xen_srv_addr;
  gchar *xen_srv_usr;
  gchar *xen_srv_psw;
  gchar *xen_srv_prt;
} Xen_Server_Connection;

そのgcharに値を割り当てたい。私はそれをファイルから読み取り、strtokで解析し、char*として返します。パーサーを設定すると、特定のトークンが検索され、次のことが行われます。

if(a==b)
  {
    Xen_Server_Connection.xen_srv_addr=Parm_Pars(pattern, 2);
    .....
  }  

この割り当ては、このifブロック内でのみ機能します。gcharはその直後にゴミになりました。しかし、私が:

if(a==b)
  {
    Xen_Server_Connection.xen_srv_addr="192.168.1.1";
    .....
  }

すべて問題ないようで、そのgcharにグローバルにアクセスできます。何かわからないようです

4

1 に答える 1

2

Parm_Pars()関数が戻り値に与える生涯保証が何であるかを理解していません。それは永遠に生きているわけではないようですので、それを使い続けたいのであれば、それを複製する必要があります。

Simply wrap that line in a call to g_strdup() to get a dynamically allocated copy and you should be fine. Of course, when you want to free your Xen_Server_Connection, you must call g_free() on all duplicated strings or you will leak memory.

UPDATE: Mixing plain char and gchar is fine, glib guarantees that gchar is just an alias for char. I think they even recommend (somewhere) that applications never use gchar.

于 2012-08-23T12:08:24.083 に答える