C 为什么分割错误+;我怎样才能摆脱它?

C 为什么分割错误+;我怎样才能摆脱它?,c,segmentation-fault,coredump,C,Segmentation Fault,Coredump,我输入了这些代码+我得到了一个分段错误。我正在尝试制作自己的特殊版本的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

我输入了这些代码+我得到了一个分段错误。我正在尝试制作自己的特殊版本的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);
}
struct optional_int{int Value;char IsNull;};
结构可选\u int strothex(char Str[]{
常量字符十六进制[0x10]=“0123456789ABCDEF”;
无符号整数Chr=0x00,i,j,Number=0x00;
无符号字符为空,为负;
如果(Str[0x0]=='-'){
IsNegative=0x1;
int N_C_Char=0;
while(Str[N_C_Char]!='\0'){
Str[N_C_Char]=Str[N_C_Char+1];//就在这里
N_C_Char++;
}
}else{IsNegative=0;}
printf(“%sfas”,Str);
对于(i=strlen(Str);i>0;i--){
无符号整数=0x0;
对于(j=0;j<0x10;j++){
if(Str[Chr]==Hex[Chr]){
数字+=((功率(0x10,i))*j);
成功++;
}
}
如果(成功!=1){
IsNull=1;
}否则{
IsNull=0;
数字=0;
}
Chr++;
}
如果(IsNegative==1){
返回(struct optional_int){Number,IsNull};
}否则{
返回(struct optional_int){Number,IsNull};
}
}
int main(int argc,const char*argv[]{
printf(“asdf%x\n”,strothex(“-535”)。值);
}

每当我给它一些负数时,它都会给我一个分段错误核心转储,但我已经找到了问题所在。

好的,所以我找到了答案。问题实际上是传递给函数的字符串。当您写入
“-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);
也会崩溃

必须提供具有写入权限的内存位置


解决此问题的另一个方法是不更改字符串以删除
-
,而是编写代码以忽略它:)

您是否尝试过在调试器中单步执行它,在执行每一行之前检查相关变量?我认为这是我们可以帮助您的最好方式。您还可以提供调用此函数的代码吗?我看不出这段代码有什么错误,也许传递给函数的字符串是问题所在。我不知道调试器是如何工作的used@VladRusu好啊我会的,那是你应该学的第一件事。否则你明天会带着一个类似的问题回到这里,因为你学的东西很少。哦,这就像你不能写文字值一样,就像做
1=3