Странная ошибка: прерывание ловушки при обработке массива символов в C

#c #string #off-by-one

#c #строка #по одному

Вопрос:

Я хочу сохранить двоичное значение каждого символа в строке и сохранить его в массиве. Но когда я начинаю возиться с такими функциями, как memset , у меня нет контроля над отладкой.

 #include <stdio.h>
#include <string.h>
int main()
{
char str[8];
char *ptr = "Hello";
int i;

for(; *ptr != 0;   ptr)
{
    printf("%c => ", *ptr);

    /* perform bitwise AND for every bit of the character */
    for(i = 7; i >= 0; --i) 
        if(*ptr amp; 1 << i) 
          str[7-i]='1';
        else
          str[7-i]='0';
        //(*ptr amp; 1 << i) ? putchar('1') : putchar('0');
    str[8]='';    
    printf("%sn",str);
    memset(str,'/0',8);        
}
return 0;
}
  

Вывод:

 H => 01001000
e => 01100101
l => 01101100
l => 01101100
o => 01101111
Abort trap
  

Было бы неплохо, если бы кто-нибудь мог пролить некоторый свет. Несмотря на то, что я получаю выходные данные, происходит прерывание.

Любезно предоставлено: Это модифицированная программа другого пользователя stack @Athabaska.

Ответ №1:

str[8]='' вызывает переполнение буфера, потому что str содержит только 8 элементов, и вы пытаетесь получить доступ к девятому.

Редактировать: я жаловался на '/0' , но, как сообщил мне @R .., он является допустимым — однако memset() в конечном итоге преобразует свой параметр в unsigned char , поэтому я не думаю, что есть какой-либо смысл в его использовании, поэтому я предполагаю, что автор захочет изменить его на '' .

Комментарии:

1. '/0' допустимо C. Это многосимвольная константа, которая имеет значение, определенное реализацией, обычно определяемое как интерпретация байтов в этом порядке как число с собственным порядком окончания.

2. @R..: 1; Я этого не знал. Однако не вижу смысла передавать многосимвольное значение функции, которая в конечном итоге преобразует свой параметр в ‘unsigned char’…

3. Ну, в типичных реализациях он будет заполняться либо '/' , либо '0' в зависимости от порядкового номера системы. 🙂

Ответ №2:

str[8]=''; недопустимо. Если объявление является char str[8]; , то допустимые индексы являются 0..7

Ответ №3:

в str[] есть место только для 8 символов, но вы получаете доступ к 9-му: str[8] = '';