Как вернуть код ошибки из функции, которая динамически создает структуры - PullRequest
1 голос
/ 27 апреля 2020

Я возвращаю код ошибки из функции create_node, чтобы, если память недоступна, она возвращалась к основному и программа заканчивалась. Я получаю ошибку, что сравнение целых чисел с указателем. Можете ли вы помочь мне разобраться с этим. Я начинающий. Спасибо.


node *create_node(void)
{
    node *newnode = (node *)malloc(sizeof(node));

    if (newnode == NULL)
        return 1;
    newnode->right = NULL;
    newnode->left = NULL;
    return newnode;
}
int main(void)
{
    int ret_val = 0;
    node *root = create_node();

    if (root == 1) {
        printf("Memory not available to create a node\n");
        return 0;
    }
    root->left = create_node();
    if (root->left == 1) {
        printf("Memory not available to create a node\n");
        return 0;
    }
    root->right = create_node();
    if (root->right == 1) {
        printf("Memory not available to create a node\n");
        return 0;
    }
}

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Согласно стандарту C (6.5.9 Операторы равенства) относительно сравнений указателей и целых чисел там написано

2 Должно выполняться одно из следующих значений:

- оба операнда имеют тип арифметики c;

- оба операнда являются указателями на квалифицированные или неквалифицированные версии совместимых типов;

- один операнд является указателем на тип объекта, а другой - указатель на квалифицированную или неквалифицированную версию void; или

- один операнд является указателем, а другой - константой нулевого указателя.

Таким образом, вы не можете сравнивать указатель и целое число без приведения.

Но в любом случае нет необходимости возвращать целое число в том случае, если выделение памяти не удастся. В таком случае достаточно вернуть NULL.

Таким образом, функция может выглядеть следующим образом:

node * create_node(void)
{
    node *newnode = malloc( sizeof( node ) );

    if  ( newnode != NULL )
    {
        newnode->right = NULL;
        newnode->left  = NULL;
    }

    return newnode;
}

Таким образом, в main вы можете написать, например,

node *root = create_node();

if ( root == NULL ) {
    printf("Memory not available to create a node\n");
    return 0;
}

без получение сообщения об ошибке компилятора.

0 голосов
/ 27 апреля 2020
 node *root = create_node();
 if(root == 1)

root - это указатель на node, который вы сравниваете со значением int 1. Вот почему возникает ошибка сравнения целого числа с указателем.

Нельзя сравнивать указатель с int в C. По крайней мере, если вы не преобразовали int в тип указателя.


Решение:

Вы должны вернуть указатель NULL, если выделение в create_node() происходит сбой вместо возврата 1:

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

 if (newnode == NULL)
 {
     return NULL;
 }

А затем проверьте root для NULL в main():

 node *root = create_node();

 if (root == NULL)
 {
     fprintf(stderr,"Memory not available to create a node\n");
     return 1;
 }

Примечания:

  1. При возникновении ошибки возвращаемое значение main() должно быть ненулевым (обычно используется 1).
  2. Вам не нужно приводить результат malloc(). Вот ссылка: Я приведу результат mallo c
  3. malloc(sizeof(*newnode)) - Использование этого гарантирует, что выделенное пространство всегда будет соответствовать объекту, указатель newnode указывает в (Важно, если позже вы захотите изменить структуру, на которую указывает newnode).
...