В вашем коде логическая ошибка
int *a,n1,z1;
В основной функции переменная 'a' является переменной-указателем.
Это локальная переменная, которая не назначена ни одному адресу.
Указывает на некоторый случайный адрес. (Допустим, указатель указывает на адрес 0x1000)
n1=load(a);
Здесь передается только значение указателя.
То есть, 0x1000 передается и присваивается другой локальной переменной 'a' загрузки функции.
a=malloc(n*sizeof(int));
Здесь malloc возвращает динамически назначенный адрес.
=> значение, переданное в качестве аргумента, теряется, а новое значение, которое выделяется динамически, присутствует в локальной переменной-указателе 'a'.
scanf("%d ",a+i);
Все входные элементы назначаются по динамически назначенному адресу, а не по адресу 0x1000
z1=add(a,n1);
Здесь снова переменная-указатель главной функции 'a', которая указывает на некоторый случайный адрес, передается в качестве первого аргумента, а не в динамически выделенную память.
Поведение равно undefined , так как мы не знаем адрес, на который указывает переменная-указатель главной функции 'a'.