Почему мне нужно инициализировать результат malloc на MacOs? - PullRequest
0 голосов
/ 19 декабря 2018

Я реализовал калькулятор 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)).

1 Ответ

0 голосов
/ 19 декабря 2018

Вот проблема:

Существует как минимум 2 способа выделения памяти, которые вы можете использовать, malloc и calloc.Разница в том, что malloc НЕ инициализирует (или не устанавливает) успешно выделенную память для чего-либо.Как объясняет @EricPostpischil, существует неопределенный явный или неявный эффект для блока памяти, специфичный для компилятора в этой позиции компиляции.

, тогда как calloc устанавливает успешно распределенный блок памяти равным нулю.Обратите внимание, что аргументы немного отличаются.

Возвращаясь к вашей проблеме, в Linux malloc просто выделил блок памяти с нулем в нем, тогда как на платформе macos что-то было в нем.

Используйте calloc, если вам это нужно, в противном случае введите memset 0 для выделенного блока памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...