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;
}
只是一個評論,但如果你使用的是GLib,那麼你應該真的使用GLib的內存分配函數等,而不是將它們與非GLib函數混合使用。 (例如,使用'g_new(MyStruct,3)'而不是'malloc(sizeof(MyStruct)* 3)') – codebeard
@codebeard:謝謝你的建議。除了一致性,你知道g_new和malloc之間是否存在技術差異嗎? –
是的,存在技術差異。請閱讀GLib文檔,它的寫作很好。 – codebeard