Language: C

#include <stdlib.h>
#define MAX_INPUT 100000

typedef struct point_t{
  int x;
  int y;
};
 
int compare(const void*, const void*);
static int ccw(point_t*, point_t*, point_t*);
void convex_hull(point_t*, int, point_t***, int*);
 
int main(void)
{
    int npoints = 0; 
    int i;
    point_t aPoints[MAX_INPUT];

    for(i = 0; i < MAX_INPUT; i++){
        aPoints[i].x = NULL;
        aPoints[i].y = NULL;
    }

    scanf("%d", &npoints);
    for (i = 0; i < npoints; i++){
        scanf("%d %d", &aPoints[i].x, &aPoints[i].y);
    }

    qsort(&aPoints, npoints, sizeof(point_t), compare);

    point_t*** out_hull;
    int h;
 
    convex_hull(aPoints, npoints, out_hull, &h);
 
    printf("%d\n", &h);
    for(i = 0; i < h -1; i++){
         printf("%d %d\n", *(out_hull+ 2 * i * sizeof(point_t)), *(out_hull+ 2 * i * sizeof(point_t) + 2));
    }
 
    return 0;
}

int compare(const void* c1, const void* c2)
{
    point_t t1 = *(point_t *)c1;
    point_t t2 = *(point_t *)c2;
 
    if(t1.y < t2.y){            /*y???§??¨????§?????????*/
        return -1;
    }else if(t1.y > t2.y){
        return 1;
    }else return 0;
}
/* Three points are a counter-clockwise turn if ccw > 0, clockwise if
 * ccw < 0, and collinear if ccw = 0 because ccw is a determinant that
 * gives the signed area of the triangle formed by p1, p2 and p3.
 */
static int ccw(point_t* p1, point_t* p2, point_t* p3)
{
    return (p2->x - p1->x)*(p3->y - p1->y) - (p2->y - p1->y)*(p3->x - p1->x);
}
 
/* Returns a list of points on the convex hull in counter-clockwise order.
 * Note: the last point in the returned list is the same as the first one.
 */
void convex_hull(point_t* points, int npoints, point_t*** out_hull, int* out_hullsize)
{
    point_t** hull;
    int i, t, k = 0;
 
    hull = *out_hull;
 
/* lower hull */
    for (i = 0; i < npoints; ++i) {
      while (k >= 2 && ccw(hull[k-2], hull[k-1], &points[i]) <= 0) --k;
      hull[k++] = &points[i];
    }
 
/* upper hull */
    for (i = npoints-2, t = k+1; i >= 0; --i) {
      while (k >= t && ccw(hull[k-2], hull[k-1], &points[i]) <= 0) --k;
      hull[k++] = &points[i];
    }
 
    *out_hull = hull;
    *out_hullsize = k;
}

Compiler output:
main.c:7:1: warning: useless storage class specifier in empty declaration
    7 | };
      | ^
main.c:10:16: error: unknown type name 'point_t'
   10 | static int ccw(point_t*, point_t*, point_t*);
      |                ^~~~~~~
main.c:10:26: error: unknown type name 'point_t'
   10 | static int ccw(point_t*, point_t*, point_t*);
      |                          ^~~~~~~
main.c:10:36: error: unknown type name 'point_t'
   10 | static int ccw(point_t*, point_t*, point_t*);
      |                                    ^~~~~~~
main.c:11:18: error: unknown type name 'point_t'
   11 | void convex_hull(point_t*, int, point_t***, int*);
      |                  ^~~~~~~
main.c:11:33: error: unknown type name 'point_t'
   11 | void convex_hull(point_t*, int, point_t***, int*);
      |                                 ^~~~~~~
main.c: In function 'main':
main.c:17:5: error: unknown type name 'point_t'; use 'struct' keyword to refer to the type
   17 |     point_t aPoints[MAX_INPUT];
      |     ^~~~~~~
      |     struct 
main.c:20:19: error: request for member 'x' in something not a structure or union
   20 |         aPoints[i].x = NULL;
      |                   ^
main.c:21:19: error: request for member 'y' in something not a structure or union
   21 |         aPoints[i].y = NULL;
      |                   ^
main.c:24:5: error: implicit declaration of function 'scanf' [-Wimplicit-function-declaration]
   24 |     scanf("%d", &npoints);
      |     ^~~~~
main.c:2:1: note: include '<stdio.h>' or provide a declaration of 'scanf'
    1 | #include <stdlib.h>
  +++ |+#include <stdio.h>
    2 | #define MAX_INPUT 100000
main.c:24:5: warning: incompatible implicit declaration of built-in function 'scanf' [-Wbuiltin-declaration-mismatch]
   24 |     scanf("%d", &npoints);
      |     ^~~~~
main.c:24:5: note: include '<stdio.h>' or provide a declaration of 'scanf'
main.c:26:35: error: request for member 'x' in something not a structure or union
   26 |         scanf("%d %d", &aPoints[i].x, &aPoints[i].y);
      |                                   ^
main.c:26:50: error: request for member 'y' in something not a structure or union
   26 |         scanf("%d %d", &aPoints[i].x, &aPoints[i].y);
      |                                                  ^
main.c:29:37: error: 'point_t' undeclared (first use in this function)
   29 |     qsort(&aPoints, npoints, sizeof(point_t), compare);
      |                                     ^~~~~~~
main.c:29:37: note: each undeclared identifier is reported only once for each function it appears in
main.c:31:16: error: 'out_hull' undeclared (first use in this function)
   31 |     point_t*** out_hull;
      |                ^~~~~~~~
main.c:34:5: error: implicit declaration of function 'convex_hull' [-Wimplicit-function-declaration]
   34 |     convex_hull(aPoints, npoints, out_hull, &h);
      |     ^~~~~~~~~~~
main.c:36:5: error: implicit declaration of function 'printf' [-Wimplicit-function-declaration]
   36 |     printf("%d\n", &h);
      |     ^~~~~~
main.c:36:5: note: include '<stdio.h>' or provide a declaration of 'printf'
main.c:36:5: warning: incompatible implicit declaration of built-in function 'printf' [-Wbuiltin-declaration-mismatch]
main.c:36:5: note: include '<stdio.h>' or provide a declaration of 'printf'
main.c: In function 'compare':
main.c:46:5: error: unknown type name 'point_t'; use 'struct' keyword to refer to the type
   46 |     point_t t1 = *(point_t *)c1;
      |     ^~~~~~~
      |     struct 
main.c:46:20: error: 'point_t' undeclared (first use in this function)
   46 |     point_t t1 = *(point_t *)c1;
      |                    ^~~~~~~
main.c:46:29: error: expected expression before ')' token
   46 |     point_t t1 = *(point_t *)c1;
      |                             ^
main.c:47:12: error: expected ';' before 't2'
   47 |     point_t t2 = *(point_t *)c2;
      |            ^~~
      |            ;
main.c:49:10: error: request for member 'y' in something not a structure or union
   49 |     if(t1.y < t2.y){            /*y???§??¨????§?????????*/
      |          ^
main.c:49:15: error: 't2' undeclared (first use in this function); did you mean 't1'?
   49 |     if(t1.y < t2.y){            /*y???§??¨????§?????????*/
      |               ^~
      |               t1
main.c:51:16: error: request for member 'y' in something not a structure or union
   51 |     }else if(t1.y > t2.y){
      |                ^
main.c: At top level:
main.c:59:16: error: unknown type name 'point_t'
   59 | static int ccw(point_t* p1, point_t* p2, point_t* p3)
      |                ^~~~~~~
main.c:59:29: error: unknown type name 'point_t'
   59 | static int ccw(point_t* p1, point_t* p2, point_t* p3)
      |                             ^~~~~~~
main.c:59:42: error: unknown type name 'point_t'
   59 | static int ccw(point_t* p1, point_t* p2, point_t* p3)
      |                                          ^~~~~~~
main.c:67:18: error: unknown type name 'point_t'
   67 | void convex_hull(point_t* points, int npoints, point_t*** out_hull, int* out_hullsize)
      |                  ^~~~~~~
main.c:67:48: error: unknown type name 'point_t'
   67 | void convex_hull(point_t* points, int npoints, point_t*** out_hull, int* out_hullsize)
      |                                                ^~~~~~~