c - 我的 C 程序出现段错误错误

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

上面依赖于一个主方法showxbits.c,我还没有调试过,但是当我使用测试主方法时出现段错误错误,当我使用gdb时出现以下错误。

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

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

最佳答案

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

  • 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 ,但请确保在调用之前提供原型(prototype)。
  • 这是一个小问题,但您的号码可能应该是 unsigned ,因为负整数没有十六进制表示。

关于c - 我的 C 程序出现段错误错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29213241/

相关文章:

c - 在C中合并多个整数范围的数据结构和算法

c - 为什么 tolower() 会影响其他字符串?

c - 我在 Unix 中遇到输入和输出问题

有人可以解释一下我不断收到的 "expression must be a modifiable lvalue"错误吗?

c++ - Segmentation Fault (Core Dumped) 从文件读取后

c - 在c中读取单独的用户输入行

c - 为什么多次执行局部变量的地址不同,用GDB调试却不一样?

linux - 在 linux 上调用 "clone()"但似乎出现故障

linux - 如何在一行中运行多个命令?

c - 使用 crypt 函数时 C 中的段错误