Понимание массивов strcpy и char в C - PullRequest
0 голосов
/ 01 апреля 2019

Почему strcpy работает в следующем примере с использованием двумерного массива символов:

int main(void) {
    char words[2][6] = {"Hello", "World"};
    strcpy(words[0], words[1]);
    printf("%s \n", words[0]);
}

Но в этом примере возникает ошибка сегментации, которая использует массив указателей на массивы символов:

int main(void) {
    char * words[2] = {"Hello", "World"};
    strcpy(words[0], words[1]);
    printf("%s \n", words[0]);
}

Большое спасибо!

1 Ответ

2 голосов
/ 01 апреля 2019

Это не из-за strcpy() - он делает одно и то же в обоих случаях: он копирует последовательно символы из источника в соответствующие позиции в месте назначения до \0 в конце исходной строки.

Причина, по которой вы получаете ошибку сегментации во втором случае, заключается в том, что эти строковые литералы теперь находятся в другом сегменте памяти, который только для чтения (например, это может быть вместе с скомпилированной программой текст). Когда strcpy() пытается ввести туда символы, ваш процесс прерывается, и ядро ​​говорит вам: «Вы не можете этого сделать, вы нарушаете сегментацию памяти» (отсюда нарушение сегментации или ошибка).

В случае first эти строковые литералы, доступные только для чтения, все еще существуют, но вы используете их для инициализации локальной переменной - (двумерного) массива, который находится в стеке. Двумерный массив - это , а не массив указателей, на самом деле это массив символов, и C просто «организует» доступ к этому массиву, так что вы можете использовать пары квадратных скобок.

См:

здесь, в StackOverflow, для более подробной информации по этим темам.

...