Trying to learn dynamic memory allocation in C


I am trying to learn dynamic memory allocation and structures and I have some questions.

First of all

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

int main()
    int *number;
    number = malloc(1*sizeof(int));
    int a;
        printf("%d ",number[a]);
    return 0;

In this sample I planned it to give me error. Because I allocated it to size of 1 integer, then I wrote it way too much integers. Shouldn't it give me an error? Can you explain this with detail please?

struct people
    char *name;
    int age;
    char *personalInfo;
} human[3];

When I define a structure like this, how can I allocate it to keep more than 3 human? How can I change it to something like human[20] or more? In case if the answer is writing *human instead of human[3], how should I allocate it? Like malloc(number*sizeof(char)*sizeof(int)*sizeof(char))?

And one more thing, in second example do I need to allocate name and personalInfo pointers?

In this sample i planned it to give me error.

You can't "plan to give an error". You're correct to say that the code is wrong because you are writing past the end of the array, but C has no bounds checking -- accessing the array is simply undefined behavior, which means that it can do literally anything -- it can pretend to work fine or it can crash, or it can cause demons to fly out of your nose.

How can i change it to something like human[20] or more?

Well... that's exactly how:

struct people {
   // members here
} human[20];

I don't see why the number "3" is so special. If you want to allocate memory dynamically, you would do it the way you would do in the case of every other data type: use the sizeof operator:

struct people *human = malloc(sizeof(human[0]) * number_of_people);


struct people *human = malloc(sizeof(struct people) * number_of_people);