c - 为什么会出现段错误+如何消除它?

标签 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, 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);
}

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

最佳答案

好吧,我明白了。问题确实是您传递给函数的字符串。当您写入“-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);

也会崩溃。

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

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

关于c - 为什么会出现段错误+如何消除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54163688/

相关文章:

macos - macOS Big Sur 中出现段错误后未生成核心转储文件

C - 将不同的回调函数地址存储在一个数组中

c++ - 无法通过套接字发送或接收数据

c++ - Qt QString Q_PROPERTY 导致 SIGSEGV

c++ - Pthread_create 在 C++ 中导致段错误

c - Argc 不适用于我的 C 程序,正在获取核心转储

c - 编写 Tcl C 扩展共享库 [链接错误]

c - Malloc 和未对齐的内存

segmentation-fault - Fortran 奇怪的赋值,是 4294967295 == .true.?

c - c 中 main 的程序参数 - ./dev --print