while循环中的分段错误(C)

时间:2016-10-06 19:13:33

标签: c segmentation-fault

我正在编写一个程序,将基数为10的数字转换为其他基数的等价物,但是当我尝试运行它时,我一直遇到分段错误。

这是到目前为止的代码:

#include <stdio.h>

int base;
int num;
char* num2[50];
int x =0;

int main(){

    printf("Input a number in base 10 and a base (2-16) that you would like to convert to in this format: 100 2\n");
    fflush(stdout);
    scanf("%d%d",&num, &base);
    printf("%d%d", num, base); fflush(stdout);

    while ((num % base) > 1){
        printf("%d", x); fflush(stdout);
        if(num % base == 10)
            num2[x] = "A";
        else if (num % base == 11)
            num2[x] = "B";
        else if (num % base == 12)
            num2[x] = "C";
        else if (num % base == 13)
            num2[x] = "D";
        else if (num % base == 14)
            num2[x] = "E";
        else if (num % base == 15)
            num2[x] = "F";
        else
            *num2[x] = num % base;

        num = num % base;
        x++;
        printf("%d, %s", num, num2[x]); fflush(stdout);
    }

    while (x >= 0){
        printf("%s", num2[1]);
        fflush(stdout);
        x--;
    }

    printf("\n");
    fflush(stdout);

    return 0;
}

通过使用gdb和print语句检查错误,我得出的结论是错误源自第14行:

while ((num % base) > 1) {

我对C比较陌生,我所做的大部分工作都是用Java编写的。

2 个答案:

答案 0 :(得分:0)

问题,正如我所看到的那样是在else声明正文中,

else
  *num2[x] = num % base;

这里,num[x]是一个空指针。你无法取消引用。您需要先将内存分配给num[x],然后才能使用该位置存储某些值。

答案 1 :(得分:0)

之前的两个答案都是正确的(即@Sourav和@Tony)。 这两个中的确切原因取决于执行实例期间提供的输入。

  1. 说,你的输入是num = 3,base = 16 然后,你的程序将在该行崩溃 -
    *num2[x] = num % base;

    num2 [x]指向NULL,因为&#39; num2&#39;是一个全局数组。

  2. 说,你的输入是num = 13,base = 16 然后,你的程序将在该行崩溃 -
    num2[x] = "D";

    这是因为&#39; num&#39;仍为常数13(num = num % base),因此&#39; x&#39;最终将超过49并且num2[x]将访问非法位置。

  3. 此外,您的程序在逻辑上存在缺陷;使用当前的方法,您将无法获得所需的输出。您的程序需要稍微调整一下 -

    char num2[50]; /* Array of chars, instead of array of pointers to char. */
    

    。 。

    /* Add check to verify that base is a value between 2 and 16. */
    
    while ((num % base) > 0){  /* Greater than 0, not 1. */
        if(num % base == 10)
            num2[x] = 'A'; /* Use a character instead of a string. */
        else if (num % base == 11)
            num2[x] = 'B';
        else if (num % base == 12)
            num2[x] = 'C';
        else if (num % base == 13)
            num2[x] = 'D';
        else if (num % base == 14)
            num2[x] = 'E';
        else if (num % base == 15)
            num2[x] = 'F';
        else
            num2[x] = (num % base) + '0'; /* Convert the number to its character form. */
    
        num /= base;  /* Duh! */
        printf("%d, %c", num, num2[x]); fflush(stdout); /* %c instead of %s*/
        x++;
    }
    
    while (x >= 0){
        printf("%c", num2[x]); fflush(stdout);  /* %c instead of %s*/
        x--;
    }