2016-10-26 2 views
0

В этой программе я пытаюсь напечатать tail, tail->next и tail->data значения в функции SortedMerge(struct node* a, struct node* b). Я создал связанный список как 5->10->15, имеющий головной указатель «a» и 2->3->20 имеющий указатель головы «b»:Нужна помощь в указателях

#include<stdio.h> 
#include<stdlib.h> 

struct node 
{ 
    int data; 
    struct node* next; 
}; 


struct node* SortedMerge(struct node* a, struct node* b) 
{ 
    /* a dummy first node to hang the result on */ 
    struct node dummy; 

    /* tail points to the last result node */ 
    struct node* tail = &dummy; 
    printf("tail %d \n",tail); 
    printf("tail->next %d \n",tail->next); 
    printf("tail->data %d \n",tail->data); 
} 

/* Function to insert a node at the beginging of the 
linked list */ 
void push(struct node** head_ref, int new_data) 
{ 
    /* allocate node */ 
    struct node* new_node = 
     (struct node*) malloc(sizeof(struct node)); 

    /* put in the data */ 
    new_node->data = new_data; 

    /* link the old list off the new node */ 
    new_node->next = (*head_ref); 

    /* move the head to point to the new node */ 
    (*head_ref) = new_node; 
} 

/* Drier program to test above functions*/ 
int main() 
{ 
    struct node* res = NULL; 
    struct node* a = NULL; 
    struct node* b = NULL; 
    push(&a,5); //some more like this (5->10->15) 
    push(&b,2); //some more like this (2->3->20) 
    res = SortedMerge(a, b); 

    return 0; 
} 

Мой вывод, как это.

tail -686550032 
tail->next 15585456 
tail->data 1 

Может ли кто-нибудь объяснить мне это.

+2

'Е ("хвост% d \ N", хвост);' это неопределенное поведение. Используйте '% p' для печати указателей. – Ari0nhh

+2

Что вы ожидали от вывода? Проблемы: во-первых, '% d' не является правильным спецификатором для указателей. Используйте '% p'. Во-вторых, 'tail-> next' и' tail-> data' являются неинициализированными значениями. При печати эти значения будут иметь случайные значения мусора. – kaylum

+0

При выполнении 'struct node dummy;' в функции SortedMerge() у вас будет неинициализированный «узел структуры», выделенный в стеке. Поэтому печать содержимого будет случайным результатом. –

ответ

1

Как заявил Ari0nhh, чтобы избежать неопределенное поведение, ваша SortedMerge функция должна использовать %p для печати указателей адресов, например, так:

printf("tail %p \n",tail); 
printf("tail->next %p \n",tail->next); 

ведет к чему-то вроде

tail 0x7fff9c7f2f80 
tail->next 0x7fff9c7f2fb8 
tail->data 0 

Но если случайно вы должны взаимодействовать с входными данными, вы должны использовать их в функции:

struct node* SortedMerge_a(struct node* a, struct node* b) 
{ 
    printf("a %p \n",a); 
    printf("a->next %p \n",a->next); 
    printf("a->data %d \n",a->data); 
} 

дает

a 0x601010 
a->next (nil) 
a->data 5