簡體   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