Это потому что writablestring
вообще не доступен для записи. Попытка записи в строковый литерал является неопределенным поведением, и strtok
записывает в него (верно, strtok
изменяет свой аргумент).
Чтобы все заработало, попробуйте:
char writablestring[] = "The C Programming Language";
Также есть C FAQ .
Другая проблема заключается в том, что вы не выделяли память для вашего массива указателей символов (поэтому эти указатели ни на что не указывают).
char* strArray[40]; /* Array of 40 char pointers, pointing to nothing. */
Может быть, попробовать это?
/* Careful, strdup is nonstandard. */
strArray[i] = strdup(token);
/* Or this. */
strArray[i] = malloc(strlen(token) + 1);
strcpy(strArray[i], token);