Manuel Pap
Manuel Pap

Reputation: 1399

Program with array of structs crashes

I have an array with multiple structs. When i ask the user to enter data the first time everything works but when i ask again for the next position in the array the program crashes. If this method doesn't work souldn't the program crash in the beginning? Is something wrong with malloc?

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



struct student {
    char name[50];
    int semester;
};

struct prof {
    char name[50];
    char course[50];
};

struct student_or_prof {
    int flag;
    int size;
    int head;
    union {
        struct student student;
        struct prof prof;
    }
}exp1;
struct student_or_prof *stack;


void init(int n)
{
   stack = malloc(n);


}

int push(struct student_or_prof **pinx,int *head,int n)
{
    char name[50];

    printf("\nn= %d\n",n);
     printf("\nhead= %d\n",*head);
    if(*head==n)
    {
        printf("Stack is full.\n");
        return 1;
    }


    char x;
    printf("Student or Professor? [s/p] ");
     getchar() != '\n';
    scanf("%c",&x);

    if(x=='s')
    {

        getchar() != '\n';
       pinx[*head]->flag = 0;

       printf("\n\nGive student's name: ");
       fgets(pinx[*head]->student.name,sizeof(pinx[*head]->student.name),stdin);

       printf("\nGive student's semester: ");
       scanf("%d",&(pinx[*head]->student.semester));

       printf("\nName = %s\tSemester = %d",pinx[*head]->student.name,pinx[*head]->student.semester);

    }
    else if(x=='p')
    {
        getchar() != '\n';
       pinx[*head]->flag = 1;

       printf("\n\nGive professor's name: ");
       fgets(pinx[*head]->prof.name,sizeof(pinx[*head]->prof.name),stdin);

       printf("\nGive course: ");
       fgets(pinx[*head]->prof.course,sizeof(pinx[*head]->prof.course),stdin);

       printf("\nName = %s\tCourse = %s\n",pinx[*head]->prof.name,pinx[*head]->prof.course);
    }



    (*head)++;
    printf("\nhead= %d\n",*head);



}


int main()
{
    int n,i;
  printf("Give size: ");
  scanf("%d",&n);

  init(n);

 for(i=0;i<n;i++)
   push(&stack,&exp1.head,n);

    return 0;
}

Upvotes: 0

Views: 595

Answers (3)

M.M
M.M

Reputation: 141554

pinx does not point to an array, so pinx[*head] is going to access invalid memory unless *head is zero.

I think you meant (*pinx)[*head] , which accesses the N-th element of the array you allocated via malloc. For example (*pinx)[*head].prof.name etc.

BTW, your head number doesn't seem to be used at all, except for exp1.head, maybe it'd be better to remove head from the struct, and just have a single variable head?

Upvotes: 0

brokenfoot
brokenfoot

Reputation: 11629

You need to malloc the structure not n

malloc(sizeof(struct student_or_prof)*n)

EDIT:

And your code crashes again because pinx is a double pointer, so this operation is not valid:

pinx[*head]->flag = 0;

this is equivalent to:

*(pinx + *head)->flag = 0;

Since you are not changing what stack points to, you are better off using a single pointer instead of a double pointer.

So instead you should change your push API:

int push(struct student_or_prof *pinx,int *head,int n)

and call it like:

push(stack,&exp1.head,n);

Upvotes: 1

thumbmunkeys
thumbmunkeys

Reputation: 20764

malloc allocates the given number of bytes.

You have to multiply n with the size of your struct, to allocate enough memory.

Upvotes: 1

Related Questions