Странная ошибка: прервать прерывание при обработке массива символов в C - PullRequest
0 голосов
/ 15 апреля 2011

Я хочу сохранить двоичное значение каждого символа в строке и сохранить его в массиве.Но когда я начинаю возиться с такими функциями, как 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 & 1 << i) 
          str[7-i]='1';
        else
          str[7-i]='0';
        //(*ptr & 1 << i) ? putchar('1') : putchar('0');
    str[8]='\0';    
    printf("%s\n",str);
    memset(str,'/0',8);        
}
return 0;
}

Вывод:

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

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

Вежливость: это модифицированная программа такого же стека, как пользователь @ Athabaska.

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

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

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

3 голосов
/ 15 апреля 2011

str[8]='\0'; недействительно.Если декларация char str[8];, то действительные индексы 0..7

2 голосов
/ 15 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...