Вы пытаетесь переписать строковый литерал с помощью:
char* arg[] = { "Hello", ..... }; // "Hello" is a string literal, pointed to by "arg[0]".
strcat(arg[0], " World"); // Attempt to rewrite/modify a string literal.
, что невозможно.
Строковые литералы доступны только для чтения, но не написать. Вот что делает их «буквальными».
Если вам интересно, почему:
char* arg[] = { "Hello", ..... };
подразумевает "Hello"
как строковый литерал, вы должны прочитать ответы на него. вопрос:
В чем разница между char s [] и char * s?
Кстати, это было бы даже невозможно (или при по крайней мере, получите ошибку сегментации во время выполнения), если вы сделаете что-то подобное:
#include <stdio.h>
#include <string.h>
int main() {
char a[] = "Hello"; // 6 for holding "Hello" (5) + "\0" (1).
strcat(a, " World");
}
, потому что массив a
должен иметь 12 символов для объединения обеих строк и использования strcat(a, " World");
- "Hello"
(5 символов) + " World"
(6 символов) + \0
(1 символ), но в нем всего 6 символов для удержания "Hello"
+ \0
. При использовании strcat()
.
пространство памяти не добавляется в массив автоматически, если вы выполняете программу с этими операторами, вы пишете за пределами массива, который является неопределенным поведением и, вероятно, вы получите сообщение об ошибке ошибки сегментации.