The second parameter to fopen() is supposed to be a C string. C strings must be NUL terminated.

Open the file like this:

FILE *file = fopen(argv[1], "r");

Also, your concat() function will not work properly. The first dimension in any array that you pass to a function will decay into a pointer to the element type of that array -- so, sizeof(array) will return the same as sizeof(char**), which is definitely not the total number of bytes used by your array.

The proper way to handle that array, since you NULL terminated it, would be:
Code:
void concat(char *array[], void (*callback)(char *result)) {
   int i;

   // Check to make sure you weren't passed a NULL pointer
   if (!array || !array[0]) return;

   // Loop until you reach the NULL terminator
   for (i = 0; array[i] != NULL; i++)
      sum += strlen(array[i]);

   // etc...
}
However, I think you should reconsider even using the concat() function period. It would make much more sense to use sprintf() or fprintf() for what you are trying to accomplish:
Code:
if (!file) {
   fprintf(stderr, "Error: The file \"%s\" could not be opened; check its permissions and try again.", argv[1]);
   return 1;
}
Or even better:
Code:
#define eprintf(fmt, ...) fprintf(stderr, "%s() : line %d : " fmt, __func__, __LINE__, ##__VA_ARGS__)
...
if (!file) {
   eprintf("Error opening file \"%s\"; check its permissions and try again.", argv[1]);
   return 1;
}
Which will give more helpful error messages with little effort:
Code:
>a.exe
main() : line 9 : Error: At least one argument (a filename) must be provided.
>a.exe blah
main() : line 16 : Error opening file "blah"; check its permissions and try again.