【问题标题】:Why the segmentation fault + how can I get rid of it?为什么分段错误+我该如何摆脱它?
【发布时间】:2019-06-07 09:20:17
【问题描述】:

我输入了这些代码 + 我遇到了分段错误。我正在尝试制作我自己的特殊版本的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);
}

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

【问题讨论】:

  • 您是否尝试过在调试器中单步执行,在执行每一行之前检查相关变量?我认为这是我们可以帮助您的最佳方式。
  • 能否也提供调用该函数的代码?我看不出这段代码有什么问题,也许你传递给函数的字符串是问题..
  • 我不知道如何使用调试器
  • @VladRusu 好的。我会
  • 那么这是你应该学习的第一件事。否则你明天会带着类似的问题回到这里,你学到的很少。

标签: c segmentation-fault coredump


【解决方案1】:

好的,所以我想通了。问题确实是您传递给函数的字符串。当你写"-535" 时,字符串被分配在程序的数据部分,你不能写。当数字为负数时,您尝试通过将数字移到 - 符号上来修改该字符串。这就是为什么它只在负数上崩溃的原因。

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

这个 sn-p 在 main 函数中为我工作。您将永远无法将常量字符串传递给引用此类字符串的函数或指针:

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

也会崩溃。

您必须提供一个您拥有写入权限的内存位置。

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

【讨论】:

  • 哦,所以就像你不能写字面值一样,就像在做1 = 3
猜你喜欢
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2013-08-19
相关资源
最近更新 更多