为什么需要在MacO上初始化malloc的结果?

时间:2018-12-19 19:01:17

标签: c malloc

我实现了一个C计算器来分析输入。 我有一个结构体(如链表),但是在macOS上,我必须通过init_null函数或值类似的变量进行初始化。 我只有一个问题:为什么?

在Linux上,没有问题。

typedef struct node_t {
    int value;
    char operator;
    struct node_t *left;
    struct node_t *right;
} node_t;

node_t *init_null(node_t *root) {
    root->value = NULL;
    root->operator = NULL;
    root->left = NULL;
    root->right = NULL;
    return root;
}

node_t *build_tree(const char *argv[], int *position) {
    node_t *new = malloc(sizeof(node_t));
    new = init_null(new); /*sinon erreur*/

    if (isdigit(*argv[*position])) {
        new->value = atoi(argv[*position]);
    } else/*Opérateur*/  {
        new->operator = *argv[*position];
        *position = *position + 1;
        new->left = build_tree(argv, position);
        *position = *position + 1;
        new->right = build_tree(argv, position);
    }
    return new;
}

运行时,./main * 2 + 3 4应打印(2 * (3 + 4))

2 个答案:

答案 0 :(得分:2)

问题出在这里

您可以使用至少两种内存分配方法,malloccalloc。区别在于malloc不会初始化(或设置)成功分配的内存给任何东西。如@EricPostpischil所述,在这种编译状态下,对编译器特定的内存块有不确定的显式或隐式影响。

calloc将成功分配的内存块设置为零。请注意,参数略有不同。

回到您的关注点,在Linux malloc中,刚好分配了一块内存为零的内存块,而在macos平台上却有东西。

如果需要,请使用calloc,否则对分配的内存块执行memset为0的操作。

答案 1 :(得分:0)

因此,我应该在具有内存集的malloc之后或仅通过使用calloc而不是malloc来初始化build_tree中的变量?