【问题标题】:I am getting a segmentation fault error on my C program我的 C 程序出现分段错误错误
【发布时间】:2015-03-23 14:47:22
【问题描述】:

我在以下代码块之一中遇到分段错误,但我怀疑是这个,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 转换为 hex 并将 hex 转换回 int。

【问题讨论】:

  • 怀疑?调试器会告诉你 exact 行。
  • gdb 告诉我错误出现在 itox 中,但不是出现错误的行。 (gdb) 运行启动程序:/home/gkendall/showxbits 程序收到信号 SIGSEGV,分段错误。 0x00000000004007ad in itox()
  • 然后使用-g 编译以包含调试信息。添加-Wall 以查看一些非常有用的消息,例如关于未初始化的变量。
  • 阅读这篇文章也可以帮助您帮助自己:ericlippert.com/2014/03/05/how-to-debug-small-programs
  • 在第一次迭代中,while(ratio != 0) 使用 ratio 未初始化。

标签: c segmentation-fault gdb


【解决方案1】:

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

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

    hexstring[i] = '0' + remainder;
    

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

  • 孤独的线

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

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

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

【讨论】:

  • 另外,NUL-terminator 被放置在所需位置之前的位置。
猜你喜欢
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 2013-11-30
  • 2015-03-20
  • 2013-09-13
  • 2018-03-29
  • 1970-01-01
相关资源
最近更新 更多