1

入力として 2 を入力すると、出力は -572662307 になります。

誰でも問題を理解できますか?

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);
}
4

1 に答える 1

1

従うのは少し難しいことを認めなければなりませんが、問題はここにあると思います:

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記載のみの場合sは返品となりますNULL。いずれにせよ、それは間違っています。

使い終わったらメモリを解放するだけで、ポインタが何を指しているかを追跡します。ここで何をしたいのかわからない場合は、ポインターとそれが指すものを区別してください。

ポインターは関数の最後で期限切れになりますが、ポインターが指すものは必ずしも有効ではありません (特に malloc で割り当てられている場合)。

複数のポインターが 1 つのものを指すことはまったく問題ありません。そのものをいじると、それを指すすべてのポインターに影響します。

于 2013-06-01T06:28:43.980 に答える