c - 如何 malloc 结构数组

标签 c arrays struct malloc typedef

<分区>

我想知道如何 malloc(然后重新分配)一个结构数组。 这是我的结构:

typedef struct tag {
    char *key;
    char *val;
} tag;

我在另一个结构中使用这个结构:

typedef struct node {
    int id;
    double lat;
    double lon;
    int visible; 
    tag *tab;
} node;

我定义了一个node *n,然后:

n->tab = (tag*)malloc(sizeof(tag) * 5);

但是我有一个错误,malloc corruption

void remplisTag(xmlNodePtr cur, node *n) {
    xmlNodePtr fils;
    n->tab = malloc(sizeof(*n->tab) * 5);
    if (n->tab == NULL) {
        error(E_ERROR_MALLOC);
    }
    printf("apres malloc\n");
    int taille = 5;
    int ind = 0;
    xmlAttrPtr attr1, attr2;
    xmlChar *key;
    xmlChar *value;
    fils = cur->xmlChildrenNode;
    fils = fils->next;
    while (xmlStrcmp(fils->name, (const xmlChar*)"text") != 0) {
        if (xmlStrcmp(fils->name, (const xmlChar*)"tag") == 0) {
            if (ind == taille - 1) {
                n->tab = realloc(n->tab, sizeof(tag) * (taille + 5));
                taille = taille + 5;
            } else {
                taille = taille;
            }
            /* searching for key */
            attr1 = xmlHasProp(fils, (const xmlChar*)"k");
            if (attr1 == NULL) {
                error(E_KEY);
            } else {
                key = xmlGetProp(fils, (const xmlChar*)"k");
                if (key == NULL) {
                    error(E_KEY_V);
                }
                /* searching for value */
                attr2 = xmlHasProp(fils, (const xmlChar*)"v");
                if (attr2 == NULL) {
                    error(E_VALUE); 
                }
                value = xmlGetProp(fils, (const xmlChar*)"v");
                if (value == NULL) {
                    error(E_VALUE_V);
                }
                tag t;
                t.key = malloc(sizeof((char*)key));
                strcpy(t.key, (char*)key);
                strcpy(t.val, (char*)value);
                t.val = malloc(sizeof((char*)value));
                n->tab[ind++] = t;
            }
        }
        fils = fils->next;
    }
    free(n->tab);
}

main 中:

node *n = malloc(sizeof(node));
xmlNodePtr cur;

while 循环中:

remplisTag(cur, n);

最佳答案

以下行存在内存分配问题

tag t;
t.key = malloc(sizeof((char*)key));
strcpy(t.key, (char*)key);
strcpy(t.val, (char*)value);
t.val = malloc(sizeof((char*)value));

C 中的内存非常繁琐 - 当您分配内存时,您需要保留足够的空间来存储数据。

tag t;
t.key = malloc(sizeof((char*)key));
strcpy(t.key, (char*)key);

为指针创建足够的 - 这可能还不够。

修复是这样的。

tag t;
t.key = strdup( key );
t.val = strdup( value );

strdup 函数结合了 malloc(正确大小)和 strcpy。

关于c - 如何 malloc 结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35684573/

相关文章:

javascript - 使用 Vue.JS v-bind :class with conditional statement of dynamically created array

c# - 为什么将结构转换为类似类的工作?

c++ - 包含打包结构的结构是否打包了自己?

无法理解嵌套三元运算符

javascript - 我在 JavaScript 中遇到了未定义的问题,并且不明白为什么

c++ - 如何在不使用 'L' 和 'R' 方向数组的情况下构建二叉树

python - 使用 20 x 1000 numpy 数组制作 Bokeh 热图

模板类中的 C++ 非模板方法

c - 在 C 库中嵌入或编码静态信息?

c - 在 Main 之外操作数组