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

时间:2015-03-23 14:47:23

标签: c segmentation-fault gdb

我在下面的一个代码块中遇到了分段错误,但我怀疑它是这个,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;
}

上面依赖于一个我尚未调试的main方法showxbits.c,但是当我使用测试主方法时,我得到了一个分段错误错误,当我使用gdb时,我得到以下错误。

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

这让我相信问题出现在上面的.c文件中的itox中。该程序应该将int转换为十六进制,将十六进制转换为int。

1 个答案:

答案 0 :(得分:2)

您的代码中有很多错误。您可以使用编译器警告捕获其中一些。但其中一些是逻辑错误。

  • ratio未初始化,并且在while条件下首次使用时会包含垃圾。它应该初始化为n
  • 您的while循环条件永远不会改变(抛开初始值),因为ratio永远是n / 16n永远不会改变。您可能不需要ratio并且可以直接使用n
  • 当你说hexstring[i] = remainder时,你不会做你认为你做的事。您想要分配一个数字,但是您为该字符分配的ASCII码为0到9,这些字符大多是不可打印的字符。 (零甚至终止字符串。)你想要

    hexstring[i] = '0' + remainder;
    

    这里。您可以对'A'的字母执行相同操作。请注意,在数字的情况下,您不会增加i,从而在循环中的下一次迭代中覆盖数字。

  • 单行

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

    没有做任何事情。您必须在调用itox的函数中分配足够的内存。

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