Ошибка сегментации небольшого кода - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь что-то проверить, и я сделал для этого небольшой тестовый файл. Код:

void main(){
    int i = 0;
    char array1 [3];
    array1[0] = 'a';
    array1[1] = 'b';
    array1[2] = 'c';

    printf("%s", array1[i+1]);
    printf("%d", i);
}

Я получаю ошибку сегментации при компиляции и попытке запуска. Пожалуйста, дайте мне знать, в чем моя проблема.

Ответы [ 4 ]

0 голосов
/ 30 апреля 2018

Когда printf видит спецификатор "%s" в строке форматирования, он ожидает char* в качестве соответствующего аргумента, но вы передали char значение выражения array1[i+1]. Это char было повышено до int, но это все еще несовместимо с char *, и даже если это так, у него нет шансов быть действительным указателем на какую-либо значимую строку символов ...

0 голосов
/ 30 апреля 2018

Пожалуйста, дайте мне знать, в чем моя проблема. ? во-первых, char array1[3]; не завершено нулем, так как недостаточно места для размещения '\0' в конце array1. Чтобы избежать этого неопределенного поведения, увеличьте размер array1.

Во-вторых, array1[i+1] это одиночная char не строка, поэтому используйте %c вместо %s как

printf("%c", array1[i+1]);
0 голосов
/ 30 апреля 2018

Предлагаю вам приобрести хорошую серию книг / видео на C. Это не тот язык, который весело подбирать на ровном месте.

В любом случае, ваша проблема в том, что вы не сформировали правильную строку. В Си строка - это указатель на начало непрерывной области памяти, которая заполнена символами. Нет никаких данных о его размере или каких-либо других характеристиках. Только где это начинается и что это такое. Поэтому вы должны предоставить информацию о том, когда строка заканчивается явно. Это достигается тем, что для самого последнего символа в строке устанавливается так называемый нулевой символ (в C он представлен escape-последовательностью '\0'.

Это означает, что любая строка должна быть на один символ длиннее содержимого, которое вы хотите сохранить. Вы также никогда не должны настраивать строку вручную, как это. Используйте библиотечную функцию, такую ​​как strlcpy, чтобы сделать это. Он автоматически добавит нулевой символ, даже если ваш массив слишком мал (путем усечения строки). В качестве альтернативы вы можете статически создать буквенную строку следующим образом:

char array[] = "abc";

Он автоматически обнуляется и имеет размер 4.

0 голосов
/ 30 апреля 2018

В строках должен быть терминатор NUL, а у вас его нет, и места для него нет.

Решение состоит в том, чтобы добавить еще один символ:

char array1[4];
// ...
array1[3] = 0;

Также вы просите напечатать строку, но вместо этого укажите символ. Вам необходимо предоставить весь буфер:

printf("%s", array1);

Тогда ты в порядке.

Потратьте время, чтобы узнать о том, как работают строки C, в частности о требованиях к терминатору, поскольку ошибки переполнения буфера - не шутка.

...