Found it! Here's the problem. This is what I was doing, essentially:

#define HI_THERE "hi "
#define ID10T "idiot"
char *data;

data = strcat(HI_THERE, ID10T);
... and the statement, of course, after the preprocessor was done with it, looked like this:

data = strcat("hi ", "idiot");
It was trying to concatenate literals, not string variables. This works:

char data[80] = HI_THERE;
char data2[80] = ID10T;

data = strcat(data, data2);
<dope slaps self>