Numbers like 10 and 15 are better with names, it makes it easier to read. That memory must be allocated for all strings has already been written. You could get the memory with only one malloc at a time and then allocate only pointers. It would be more efficient for small amounts of memory and you only have to check once if you got the memory. Memory requested with malloc should be freed with free() as soon as it is no longer needed.
#define STCOUNT 10
#define STLEN 15
int i, j;
char *baseptr, *item, *string[STCOUNT];
baseptr = (char*)malloc((STLEN+1)*STCOUNT); if (baseptr == NULL) { exit(11); }
item = baseptr;
for (i = 0; i < STCOUNT; i++) {
string[i] = item;
item += (STLEN + 1);
scanf("%15s", string[i]); }
if (baseptr)
free(baseptr);
Using the scanf function with the %s option without a length limit is very careless. Besides alternatives like fgets() you could at least specify the maximum length with %s. Recently there are also the secure versions with _s.
Instead of copying all letters of the strings several times, it would be much more efficient to swap only the pointers:
if (strcmp(string[i], string[j]) == 1) {
item = string[i];
string[i] = string[j];
string[j] = item;
}
If you need only small amounts of memory, as in this case, you could also save the effort with malloc() completely and define the field like this:
char string[STCOUNT][STLEN + 1];