conan tannous
conan tannous

Reputation: 89

My program crashes when I set a pointer to a NULL

this is driving me nuts, I've done my homework but for some reason here

for (int i = 0; i < room->num_of_challenges; i++) { // need a check
        if (strcmp(room_to_enter, room->challenges[i].challenge->name) == 0) {
            room->challenges[i].start_time = start_time;
            room->challenges[i].visitor = malloc(sizeof(room->challenges[i].visitor));
            room->challenges[i].visitor->current_challenge = malloc(sizeof(room->challenges[i].visitor->current_challenge));
            *room->challenges[i].visitor->current_challenge = room->challenges[i];
            *room->challenges[i].visitor->room_name = NULL;
            *room->challenges[i].visitor->room_name = malloc(strlen(room_to_enter)+1);
            strcpy(*room->challenges[i].visitor->room_name, room_to_enter);
            inc_num_visits(room->challenges[i].challenge);
        }
    }

the program just crashes for some reason, at this point:

*room->challenges[i].visitor->room_name = malloc(strlen(room_to_enter)+1);

it's a 3 pages code with headers for each, and each page is about 300 line, so I can't post them all, also here are the structs:

struct SChallengeActivity;
typedef struct SVisitor
{
  char *visitor_name;
  int visitor_id;
  char **room_name;
  struct SChallengeActivity *current_challenge;
} Visitor;


typedef struct SChallengeActivity
{
   Challenge *challenge;
   Visitor *visitor;
   int start_time;
} ChallengeActivity;


typedef struct SChallengeRoom
{
   char *name;
   int num_of_challenges;
   ChallengeActivity *challenges;
} ChallengeRoom;

We can't edit the struct because it's given by the homework like that, the thing is I tried to set this line to NULL, like so:

 *room->challenges[i].visitor->room_name = NULL;

and it still crashes at that line too, for some reason it can't reach that field in the struct. Note: ignore the coding, I know I should check the malloc after each line, but for now I want it to work, I've been up all night to get it to work, and I couldn't, any help please ? Thank you

Upvotes: 0

Views: 238

Answers (2)

user7994388
user7994388

Reputation: 473

Also,

*room->challenges[i].visitor->room_name = NULL;

room_name is a char** (pointer-to-pointer), which means it's still a pointer, and you dereference it before it's set.

Not sure why it needs to be a pointer-to-pointer, but if it needs to be, then you first have to allocate memory for one or more pointers (eg array):

room->challenges[i].visitor->room_name = malloc(sizeof(char*)*1);
*room->challenges[i].visitor->room_name = malloc(strlen(room_to_enter)+1);
...

Upvotes: 1

Brian Zammit
Brian Zammit

Reputation: 179

When allocating memory for the visitor, you are only allocating the aize of a pointer. The visitor field inside your challenge is only a pointer to a Visitor. Thus you are not allocating enough memory. You should use:

malloc(sizeof(Visitor))

To get the real size of the Visitor structure and allocate ample space.

Also, setting pointers to null before allocating is useless. The call to malloc() will overwrite them.

Upvotes: 1

Related Questions