c-带有结构的Malloc



这是C语言的代码,在Ubuntu 15.10:上编译

-----node_tree.h-----

    struct node_tree{ 
        int key;
        char value[20];
        struct node_tree* right_child;
        struct node_tree* left_child;
    };
    typedef struct node_tree* node;

-----tree_test_main.c-----

    #include "node_tree.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include <string.h>
    #include <time.h>
    int main(){
        //root
        node root = malloc(sizeof(node));
        root->key = 1;
        strcpy(root->value, "Ciao");
        //left child
        node left = malloc(sizeof(node));
        left->key = 2;
        strcpy(left->value, "Maremma");
        //right child
        node right = malloc(sizeof(node));
        right->key = 3;
        strcpy(right->value, "Maiala");
        root->left_child = left;
        root->right_child = right;
        printf("%d, %sn", root->key, root->value);
        printf("%d, %sn", root->left_child->key, root->left_child->value);
        printf("%d, %sn", root->right_child->key, root->right_child->value);
        free(root);
        free(right);
        free(left);
    }

这是控制台输出,我不明白为什么会出现字符串"8446000"。我在Mac OS X上尝试了同样的代码,它运行得很好。

1, Ciao
8446000, 
3, Maiala
*** Error in `./a.out': free(): invalid next size (fast): 0x000000000080e010 ***
[1]    3926 abort (core dumped)  ./a.out
    node root = malloc(sizeof(node));

这为指针而不是结构分配大小。试试这个:

    node root = malloc(sizeof(*root));

其他变量也是如此。

node是指针类型,其大小将小于结构的大小,因此分配的空间不足,您正在访问超出范围的内容。

请尝试使用sizeof(struct node_tree)而不是sizeof(node)

我建议您应该停止使用指向指针的typedef,以避免混淆。

这是不应该在typedef后面隐藏指针的原因之一。

sizeof(node)返回sizeof(struct node_tree*),而不是您所期望的sizeof(struct node_tree)

将typedef更改为而不是隐藏指针:

typedef struct node_tree node;

为了安全起见,使用变量而不是类型进行分配:

node * root = malloc(sizeof(*root));

您需要分配正确的大小:

node N = malloc(sizeof *N);

试着打印他们的尺寸来查看:

printf("sizeof N =  %zu", sizeof N);
printf("sizeof *N = %zu", sizeof *N);

EDIT:将类型替换为变量。

相关内容

  • 没有找到相关文章

最新更新