2016-06-27 3 views
2
int main(void) 
{ 
    // create a node 
    node* list1 = malloc(sizeof(node)); 
    node* list2 = malloc(sizeof(node)); 
    list1 -> n = 2; 
    list2 -> n = 5; 
    list1 -> next = list2; 
    list2 -> next = NULL; 

    if(search(5, list1)) 
     printf("True\n"); 
    else 
     printf("False\n"); 

} 

В приведенной выше программе, когда я инициализировал переменные типа node, мне пришлось явно выделять память для этих переменных, иначе компилятор выдавал ошибки.Ошибка с распределением памяти

bool search(int n, node* list) 
{ 
    node* ptr = list; 
    while(ptr != NULL) 
    { 
     if(ptr -> n == n) 
     { 
      return true; 
     } 
     ptr = ptr->next; 
    } 
    return false; 
} 

но, в приведенной выше функции «поиск» У меня есть переменная узла «PTR» типа, но я получил через без явного выделения памяти для него. Почему в этой функции нет ошибок?

+6

Вы пропустили 'node * ptr = list;' part? –

+0

Перед тем, как попытаться использовать его, вам необходимо присвоить значение переменной указателя. В 'main' не было выделенных узлов, поэтому вам пришлось выделить их с помощью' malloc'. В 'search' вы передаете один из них в качестве аргумента и присваиваете его' ptr'. Поэтому 'ptr' вначале указывает на узел, который был передан ему. Я предполагаю, что вы скопировали этот код и пытаетесь его понять? –

ответ

4

Было бы неплохо добавить предупреждение в ваш Q. Однако я предполагаю, что это что-то вроде «неинициализированной переменной».

Как уже упоминалось в комментариях pm100, вы можете получить ошибку времени выполнения, когда программа выполнена. Однако по той же причине.

«Инициализировано» не означает «назначить выделенную память», но присваивает ему какое-либо значение. В search() вы сделаете это правильно здесь:

node* ptr = list; 

В main() вы не сделаете этого, если у вас есть только:

node* list1; // No initialization 

КСТАТИ: компилятор может обнаружить, если вы назначаете NULL к нему, а затем разыщите его с помощью ->. Так что может быть ошибка, если у вас есть такой код:

node* list1 = NULL; 
list1 -> n = 2; // Dereferencing NULL pointer constant 

Но является ли компилятор обнаруживает, что или не зависит от него. Опять же, во время выполнения вы получите ошибку в любом случае.

+0

Мое предположение заключается в том, что «ошибки компилятора» были на самом деле крахом во время работы – pm100

+0

О, возможно, тоже. –

3

У меня есть переменная типа «ptr», но я прошел без явного выделения памяти для нее. Почему в этой функции нет ошибок?

ptr не является тип node. Код имеет переменную под названием ptr, которая является указателем для ввода node.

Следующий код создает пробел для pointer.

node* ptr = list;