繁体   English   中英

我的C程序出现分段错误错误

[英]I am getting a segmentation fault error on my C program

我在以下代码块之一中遇到分段错误,但我怀疑它是xbits.c:

#include <stdio.h>
#include <math.h>

void itox(int n, char hexstring[]);
int xtoi(char hexstring[]);

void itox(int n, char hexstring[]) {
    hexstring[2*sizeof(n) + 1];
    int ratio, remainder;
    int i = 0;
    while(ratio  != 0)
    {

        ratio = n / 16;
        remainder = n % 16;
        if (remainder == 10){
            hexstring[i] = 'A';
            i++;
        }
        else if (remainder == 11){
            hexstring[i] = 'B';
            i++;
        }
        else if (remainder == 12){
            hexstring[i] = 'C';
            i++;
        }
        else if (remainder == 13){
            hexstring[i] = 'D';
            i++;
        }
        else if (remainder == 14){
            hexstring[i] = 'E';
            i++;
        }
        else if (remainder == 15){
            hexstring[i] = 'F';
            i++;
        }
        else 
            hexstring[i] = remainder;

    }   
    i++;
    hexstring[i] = '\0';
}

int xtoi(char hexstring[]) {
    int i, integer;
    int length = getLength(hexstring);
    for (i = length-2 ; i >= 0 ; i--)
    {
         integer += (int) pow((float) hexstring[i] , (float) i);
    }

    return integer;
}

int getLength (char line[])
{
    int i;

    i=0;
    while (line[i])
        ++i;
    return i;
}

上面的代码依赖于我尚未调试的主要方法showxbits.c,但是当我使用测试主要方法时,出现了段错误错误,而当我使用gdb时,出现了以下错误。

Program received signal SIGSEGV, Segmentation fault.
0x00000000004007ad in itox ()

这使我相信问题出在上述.c文件中的itox中。 该程序应该将int转换为十六进制,然后将十六进制转换回int。

您的代码中有很多错误。 您可以通过编译器警告来捕获其中的一些。 不过,其中一些是逻辑错误。

  • ratio未初始化,在while条件中首次使用时将包含垃圾。 它可能应该初始化为n
  • 您的while循环条件将永远不会改变(不考虑初始值),因为ratio将始终为n / 16并且n不会改变。 您可能不需要ratio ,可以直接对n进行操作。
  • 当您说hexstring[i] = remainder您不会按照自己的想法去做。 您想分配一个数字,但要分配一个字符,其ASCII码为0到9,这些字符大多是不可打印的字符。 (零甚至终止字符串。)

     hexstring[i] = '0' + remainder; 

    这里。 您可以对带有'A'字母执行相同'A' 请注意,对于数字,您不会增加i ,因此在循环的下一次迭代中将覆盖数字。

  • 孤行

     hexstring[2 * sizeof(n) + 1]; 

    什么也没做 您必须在调用itox的函数中分配足够的内存。

  • 您将字母以错误的顺序写入字符串。
  • 解码时,请勿使用十六进制数字的ASCII值。 您必须将它们转换为0到15之间的值。
  • 不要将pow函数用于简单的整数运算。 取而代之的是,遵循itox的模式:将结果乘以16,然后加上下一个十六进制数字的值。
  • 当然,您可以滚动自己的strlen并将其称为getLength ,但是请确保在调用它之前提供一个原型。
  • 这是一个小问题,但是您的数字应该没有unsigned ,因为没有负整数的十六进制表示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM