分段故障(核心转储) - C不再存在分段故障问题。现在我可以调试了。谢谢

时间:2017-05-04 02:38:05

标签: c

代码编译正常。当我执行时,我只收到消息(Segmentation fault(core dumped))。任何帮助将不胜感激!

该程序应该改变输入参数的基础。例如./convert 10 2 5 6 7 输入基数:10 产出基数:2 输入基数中的参数:5 6 7

我刚开始学习c ...你能提供的任何帮助都会很棒! 谢谢!

编辑:不再遇到分段错误问题。谢谢。

#include <stdio.h>
#include <string.h>




int makeInt(char digits[]) {
    int num = 0;
    int i = 0;
    while (digits[i] != '\0') {
    num = num * 10 + (digits[i] - '0');
    i++;
 }
 return num;
}


//converts from original base to base 10
int makeBase10(char digits[],int a) {
    int num = 0;
    int pow = 1;
    int i = 0;
    int x = 0;
    int length = strlen(digits);
    char k;
    for (i = length -1; i > -1; i--){
        k = digits[i];
        if(k <= '9' && k >= '0'){
            x = (int)k - '0';
        }
        else{
            x = (int)k - 'a' + 10;

        }
        num = num + (x*pow);
        pow = pow * a;

    }
    return num;
}
//changes number from base 10 to knew base
// and returns as string
char * toString(char str[], int num, int b) {

    int i = 0;
    char x;
    int mod = 0;
    while(0 < num){
        mod = num % b;
        if(mod < 10 && mod > -1){
            x = (char)(num + '0');
        }
        else{
            x = (char)(num - 10 + 'a');
        }

        str[i] =(int) x;
        num = num/b;
    }
    str[i] = '\0';

    int length = i + 1;
    int j = 0;
    char *reverse;
    for(i = length -2; i >= 0; i--){

        reverse[i] = str[j];
        j++;
    }
    reverse[length-1] = '\0';
    return reverse;
}



 int main(int argc, char *argv[]) {
    int i;
    int num;
    int a;
    int b;
    char str[33]; //binary could be up to 32 + '\0'
    a = makeInt(argv[0]);  //input base
    b = makeInt(argv[1]);;  //output base
    printf("make int worked and input works");
    num = 0;
    i = 2;
    while (i < argc) {
        num = makeBase10(argv[i], a);
        printf("%s\n", toString(str, num, b));
            i++;
    }


}

2 个答案:

答案 0 :(得分:1)

您正在使用未初始化的指针。

int length = i + 1;
int j = 0;
char *reverse; // here is the problem
for(i = length -2; i >= 0; i--){

    reverse[i] = str[j];
    j++;
}
reverse[length-1] = '\0';

当使用未初始化的指针时,您正在写入恰好存储在该变量中的任何内存地址。没有给出合理的价值。因此,您正在写入一些不适合写入应用程序的内存位置。计算机内存是分段的。每个记忆区域都有一个所有者,可以在那里写。这是一个安全预防措施,它可以防止错误导致系统混乱。 您必须先使用malloc

初始化
char *reverse = malloc(length);

或者如果你在编译时知道你可以做的最大尺寸:

char reverse[MAX_SIZE];

P.S。为了反转你不要遍历整个字符串直到开始只有一半。而不是for(i = length -2; i >= 0; i--)写:for(i = length -2; i >= length / 2; i--)

答案 1 :(得分:0)

char * reverse in toStrong没有分配任何内存,可能导致段错误,部分来自argv [0]总是你运行的程序的名称,你需要使用argv [1]以后的输入