In this line of your code
BN_bin2bn(&x_compressed_byte_array[0],200,NULL); // length is in bits?
You should pass bn_compressed, the BIGNUM you created, to hold the converted result. And the length is in bytes.
BN_bin2bn(&x_compressed_byte_array[0],sizeof(x_compressed_byte_array),x_compressed);
After you set_compressed_coordinates, you can verify if the point you just created locate correctly in the group.
if (!EC_POINT_is_on_curve(curve_group,point,NULL)) return 0;
To further examine the point coordinates (x,y), you can place this in your code.
if (!EC_POINT_get_affine_coordinates_GFp(curve_group, point, x, y, NULL)) return 0;
fprintf(stdout, "\point = (x,y)\n");
fprintf(stdout, " x = 0x");
BN_print_fp(stdout, x);
fprintf(stdout, "\n y = 0x");
BN_print_fp(stdout, y);
fprintf(stdout, "\n");
Just remember to new/free BIGNUM x and y at the first/end of your function.
BIGNUM *x, *y;
x = BN_new();
y = BN_new();
/* your code */
if(x) BN_free(x);
if(y) BN_free(y);
And it should work. The result xy[49] I have is
0x0471C073739BBFC20A81CDDDF4CFCAC7B7A99961232C5C637C388AB06AA7E43A2B5CFE2D7F3AC2DF910D6F8D8F209CD817