Как это работает: char *array[10]
- это массив из 10 char *
указателей (в основном 10 таких же вещей, как token
).
token = "testing"
создает статическое пространство где-то в памяти вашей программы во время сборки и помещает туда «тестирование». Затем во время выполнения устанавливает адрес для этого статического "тестирования" в token
.
array[0] = "again"
делает в основном то же самое.
Затем strcat(array[0], token)
берет адрес в array[0]
и пытается добавить содержимое token
в строку по этому адресу. Что дает вам segfault, поскольку array[0]
указывает на сегмент данных только для чтения в вашей памяти.
Как это сделать правильно:
char * initial = "first"; // pointer to static "first" string
char * second = "another"; // another one
char string[20]; // local array of 20 bytes
strcpy(string, initial); // copies first string into your read-write memory
strcat(string, second); // adds the second string there
На самом деле, если вы не хотите стрелять себе в ногу, лучший способ сделать что-то вроде последних двух строк:
snprintf(string, sizeof(string), "%s%s", initial, second);
snprintf
затем гарантирует, что вы не используете более 20 байтов string
. strcat
и strcpy
с радостью перейдут через ограничение в недопустимую память и вызовут еще один segfault во время выполнения или что-то еще хуже (например, эксплойты безопасности), если скопированная строка будет длиннее, чем пространство назначения.