2015-10-13 2 views
1

UPD2: Алгоритм генерирует байты из выделенного диапазона. Так что это логичная ошибка.Ошибка адресной границы

UPD: modifyed Printf в

printf("%d\n", bytes); 

Но результат такой же - SIGSEGV.

Я новичок в чистом c кодировании. Это просто рядом с "привет мир" Приложение:

#include <stdint.h> 
#include <stdio.h> 
#include <stdbool.h> 


void encode2(int src){ 
    unsigned char * result =(unsigned char *) malloc(sizeof(unsigned char) *10); 
    int bytes = 0; 
    bool More; 
    do{ 
     uint8_t Byte = src & 0x7f; 
     src >> 7; 
     More = !((((src == 0) && ((Byte & 0x40) == 0)) || 
        ((src == -1) && ((Byte & 0x40) != 0)))); 
     if (More) 
      Byte |= 0x80; 
     result[bytes] = Byte; 
     bytes++; 
    } while(More); 
    printf(bytes); 
    unsigned char * str = (unsigned char *) malloc(sizeof(unsigned char) * bytes); 
    int i; 
    for (i=0; i<bytes; i++){ 
     str[i] = result[i]; 
    } 
} 

int main(int argc, char *argv[]){ 
    encode2(10); 
    /*printf("%s\n",p);*/ 
    return 0; 
} 

Работа 1,»./leb128' останавливали сигнала SIGSEGV (граница ошибки Адрес)

Пробовал Google SIGSEGV, но не смог нашел что не так?

+0

[Пожалуйста, просмотрите эту дискуссию о том, почему бы не использовать возвращаемое значение 'malloc()' и family в 'C'.] (Http://stackoverflow.com/q/605845/2173917). –

+0

где is bound for 'result [bytes]'? –

+0

'printf (bytes);' ..... вы этого не делаете. –

ответ

1

Вы должны проверить делать во время цикла , потому что в этом bool More никогда не будет установлена ​​в ложь, потому что вы обращаетесь к дополнительной памяти (result[bytes] = Byte; ), так что вы получаете сообщение об ошибке.

1

A SIGSEGV просто сообщает вам, что вы получили доступ к памяти, которую вы не выделили. Ваш звонок printf() непосредственно после цикла while вызывает SIGSEGV.

Первый параметр для printf() - это char*, который указывает на строку формата в виде символьного массива с нулевым символом. Предположим, что bytes равно 2. Тогда C интерпретирует 2 как адрес памяти и в printf() попытается прочитать строку с нулевым завершением, которая находится по адресу 0x0000000000000002. Это, скорее всего, не доступно для вас.

Я думаю, что вы имели в виду есть printf("%d\n", bytes);

Пожалуйста, обратите внимание, что вам придется free() всю память, вы выделенные с помощью malloc(). В C нет сборщика мусора, поэтому вся память, которую вы выделяете, остается до вас до сих пор. free() снова. Вы не хотите этого в более длительных процессах.

+0

Я изменил printf. Тот же результат. – user3003873

+0

Получаете ли вы результат 'printf()' перед 'SIGSEGV'? Если нет, я бы предположил, что ваш расчет 'More' неверен, и вы пишете прошлый результат [9]'. – cdonat

+0

Да, это так. – user3003873

Смежные вопросы