Pergunta

If i enter 2 as input, the output is -572662307.

Can anyone figure out the problem?

struct node
{
    int rollno;
    struct node*n;
};
void read(struct node*);
void display(struct node*);
struct node* create();
struct node* cread();
struct node*head=NULL;
struct node*tail=NULL;
void read(struct node*p)
{
    scanf("%d",&p->rollno);
    p->n=NULL;
    printf("\n");
}
void display(struct node*p)
{
    printf("%d\n",p->rollno);
}
struct node* create()
{
    struct node*q;
    q=(struct node*)malloc(sizeof(struct node));
    return q;
}
struct node* cread()
{
    struct node*j;
    j=create();
    read(j);
    return j;
}
void push(struct node*cur)
{
    if(head==NULL)
    {
        head = cur;
        tail = cur;
    }
    else
    {
        struct node*f;
        f=head;
        head->n = cur;
        head=head->n;
    }
}

struct node* pop()
{
    struct node*p;
    struct node*s = NULL;
    p=tail;
    if(p==NULL)
    {printf("\n\t\t\tSTACK EMPTY\n");}
    else
    {
        //display(p);
        s = p;
        tail=p->n;
        free(p);
    }
    return s;
}


DWORD WINAPI workerThreadProcedure(LPVOID lparam)
{
   struct node* cur;
   struct node* disp = NULL;
   printf("Enter the input: ");     
        cur =cread();
        push(cur);
        disp = pop();
        printf("%d\n",disp->rollno);

    return 0;
}

void main()
{
   HANDLE workerThreadHandle[40];
   int max_number=40;
   for (int i = 0; i < 1; i++) 
   {
      workerThreadHandle[i]= CreateThread( NULL,
                                     0,
                                     workerThreadProcedure,
                                     (LPVOID)i,
                                     0,
                                     NULL
                                    );
   }
   Sleep(5000);
}
Foi útil?

Solução

I have to admit it's a bit difficult to follow but I think the problem is here:

struct node* pop()
{
    struct node*p;
    struct node*s = NULL;
    p=tail;
    if(p==NULL)
    {printf("\n\t\t\tSTACK EMPTY\n");} // after that will jump to 'return' where 's' is NULL
    else
    {
        //display(p);
        s = p; // 's' and 'p' point to the same memory block now
        tail=p->n;
        free(p); // Ooops you've freed the memory block 's' and 'p' point to
    }
    return s; // You now return a freed memory block, this is undefined behavior
}  

If it entered the if statement only, s will be returned NULL. In any case it's wrong.

You only free memory once you're done with it, keep track of what your pointers point to. Not sure what you wanted to do here, distinguish between the pointer and what it points to.

The pointer will expire at the end of the function, what it points to will not necessarily (especially if it's allocated with malloc).

It's entirely okay for several pointers to point to one thing and when you fiddle with that thing, it affects all pointers that point to it.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top