2012-12-09 108 views
0

我正在使用全局變量z作爲計數器。有沒有辦法使用MyStruct len作爲我的計數器?我寧願不使用全局變量。如何避免函數指針中的全局變量C

#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <glib.h> 

typedef struct st { 
    char *key; 
    char *str; 
    int len; 
} MyStruct; 

int z = 0; 
static void hash2struct (gpointer key, gpointer value, gpointer data) { 
    MyStruct **s = data; 
    gchar *k = (gchar *) key; 
    gchar *h = (gchar *) value; 
    s[z]->key = strdup(k); 
    s[z]->str =strdup(h); 
    z++; 
} 

int main(int argc, char *argv[]){ 
    int i; 

    GHashTable *hash = g_hash_table_new(g_str_hash, g_str_equal); 

    g_hash_table_insert(hash, "Virginia", "Richmond"); 
    g_hash_table_insert(hash, "Texas", "Austin"); 
    g_hash_table_insert(hash, "Ohio", "Columbus"); 

    MyStruct **s = malloc(sizeof(MyStruct) * 3); 
    for(i = 0; i < 3; i++) { 
     s[i] = malloc(sizeof(MyStruct)); 
    } 
    g_hash_table_foreach(hash, hash2struct, s); 

    for(i = 0; i < 3; i++) 
     printf("%s %s\n", s[i]->str, s[i]->key); 

    for(i = 0; i < 3; i++) { 
     free(s[i]->str); 
     free(s[i]->key); 
     free(s[i]); 
    } 
    free(s); 
    g_hash_table_destroy(hash); 
    return 0; 
} 
+0

只是一個評論,但如果你使用的是GLib,那麼你應該真的使用GLib的內存分配函數等,而不是將它們與非GLib函數混合使用。 (例如,使用'g_new(MyStruct,3)'而不是'malloc(sizeof(MyStruct)* 3)') – codebeard

+0

@codebeard:謝謝你的建議。除了一致性,你知道g_new和malloc之間是否存在技術差異嗎? –

+0

是的,存在技術差異。請閱讀GLib文檔,它的寫作很好。 – codebeard

回答

2

您可能設想z爲保持所分配的陣列中使用的細胞的數量的軌道。如果您試圖將價值堅持到個人MyStruct s您將冒險多個不同的值。

而是認爲你可以打包的陣列,它的計數器(實際上建立一個動態數組類型):

struct { 
    int length; 
    MyStruct *ary; 
} MyStructDArray; 

他們你把這個東西一個實例,並通過hash2struct常規。

+0

正是我在找的東西。謝謝! –