0

我使用全局变量z作为计数器。有没有办法使用 MyStruct len 作为我的计数器?我宁愿不使用全局变量。

#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;
}
4

1 回答 1

2

您大概设想z跟踪分配的数组中使用的单元数。如果您试图将值粘贴到单个MyStructs 中,您将面临多个不同值的风险。

而是考虑您可以打包数组并将其作为计数器(实际上是构建动态数组类型):

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

他们你保留这件事的一个实例并将其传递你的hash2struct例程。

于 2012-12-09T05:48:03.900 回答