Почему ошибка сегментации + как я могу от нее избавиться? - PullRequest
0 голосов
/ 12 января 2019

Я набрал эти коды + Я получил ошибку сегментации. Я пытаюсь сделать свою собственную специальную версию strtol:

struct optional_int {int Value; char IsNull;};
struct optional_int StrToHex(char Str[]) {
    const char Hex[0x10] = "0123456789ABCDEF";
    unsigned int Chr = 0x00,i,j,Number = 0x00;
    unsigned char IsNull, IsNegative;
    if(Str[0x0] == '-') {
        IsNegative = 0x1;
        int N_C_Char = 0;
        while( Str[N_C_Char]  !=  '\0' ) {
            Str[N_C_Char]=Str[N_C_Char+1];//right here
            N_C_Char++;
        }
    }else{IsNegative=0;}
    printf("%sfas", Str);
    for(i = strlen(Str); i > 0; i--){
        unsigned int Successes = 0x0;
        for( j = 0; j < 0x10; j++ ) {
            if( Str[Chr]==Hex[Chr]) {
                Number+=((pow(0x10, i))*j);
                Successes++;
            }
        }
        if(Successes!=1) {
            IsNull = 1;
        }else{
            IsNull = 0;
            Number = 0;
        }
        Chr++;
    }
    if(IsNegative == 1) {
        return (struct optional_int){ Number, IsNull};
    }else{
        return (struct optional_int){-Number, IsNull};
    }
}

int main(int argc, const char *argv[]) {
    printf("asdf %x\n", StrToHex("-535").Value);
}

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

1 Ответ

0 голосов
/ 13 января 2019

Хорошо, так что я понял это. Проблема в том, что строка, которую вы передаете в функцию. Когда вы пишете "-535" строка размещается в разделе данных программы, и вам не разрешено ее писать. Если число отрицательное, вы пытаетесь изменить эту строку, сдвигая цифры над знаком -. Вот почему он падает только на отрицательные числа.

int main(int argc, const char *argv[]) {
    char c[200];
    strcpy(c, "-535");
    printf("asdf %x\n", StrToHex(c).Value);
}

Этот фрагмент работает для меня в функции main. Вы никогда не сможете передавать константные строки в функцию или указатели, которые ссылаются на строки такого типа:

char c[200] = "-535";
StrToHex(c);

также вылетит.

Вы должны указать область памяти, в которой у вас есть права на запись.

Еще один обходной путь к вашей проблеме - не изменять строку для удаления -, а писать свой код, просто игнорируя его:)

...