yes I know but I have to use it cause its a requirement on my project that's why I'm confused
Please show the text of your project requirements.

What exactly don't you understand?

It seems to me that you're confusing yourself by using dynamic memory, so I'd recommend you start with the simpler static allocated array. Define the array in main() and pass the array and the size of the array to your functions as required.

I'd start with something more like:

Code:
#include <stdio.h>
#include <stdlib.h>

#define ARRAY_SIZE 3

typedef struct LandData
{
    int type;
    int height;
} LandData;

void getData(LandData data[], int arraySize);


int main()
{
    LandData data[ARRAY_SIZE];
    getData(data, ARRAY_SIZE);
}

void getData(LandData data[], int arraySize)
{
    for(int i = 0; i < arraySize; i++)
    {
        printf("choose height: ");
        scanf("%d", &data[i].height);
        printf("Choose type: ");
        scanf("%d", &data[i].type);
    }
}
I'll leave the write/read/display functions for you to implement.