[英]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
的函数中分配足够的内存。
pow
函数用于简单的整数运算。 取而代之的是,遵循itox
的模式:将结果乘以16,然后加上下一个十六进制数字的值。 strlen
并将其称为getLength
,但是请确保在调用它之前提供一个原型。 unsigned
,因为没有负整数的十六进制表示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.