分段错误(核心转储)分配内存?

时间:2016-09-21 04:33:44

标签: c memory permutation

我得到错误"分段错误(核心转储)"当我运行这个程序。我是c编程的新手,所以它可能是愚蠢的东西,但我无法弄明白。

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

void swap(char *x, char *y){
    char temp = *x;
    *x=*y;
    *y=temp;
}

char** getPermutations(char *string){
    int length = strlen(string);
    int startIndex = 0;
    int endIndex = length - 1;

    if(startIndex == endIndex){
            printf("%s\n", string);
    }else{
            for(int j = startIndex; j<=endIndex; j++){
                    swap((string + startIndex),(string + j));
                    getPermutations(string);
                    swap((string+startIndex),(string+j));
            }  
    }    
}

int main(int argc, char *argv[]){
     if(argc>2){
            printf("\nToo Many arguments\n");
            exit(0);
    }else{
            printf("%s",argv[1]);
            char * str = malloc(strlen(argv[1]) + 1);
            strcpy(str,argv[1]);
            getPermutations(str);
    }
}

2 个答案:

答案 0 :(得分:2)

您的问题是getPermutations无休止地呼唤着自己。你需要传递额外的东西才能知道何时停止。就像它一样,它只是一遍又一遍地调用自己,直到你有一个堆栈溢出。

此外,您已getPermutations设置为返回char**,但之后您永远不会返回任何内容。所以这也很奇怪。

答案 1 :(得分:1)

我的建议:

  1. 将函数的返回类型更改为void,因为它不会返回任何内容。

  2. 将函数名称更改为printPermutations,因为它只是打印排列。

  3. 提供结束递归的方法。将startIndex作为参数传递。

  4. 传递字符串的长度,这样每次递归调用函数时都不会计算它。

  5. 将比较运算符更改为>=以考虑零长度字符串。

  6. void printPermutations(char *string, int startIndex, int length){
       int endIndex = length - 1;
    
       if(startIndex >= endIndex){
          printf("%s\n", string);
       }else{
          for(int j = startIndex; j<=endIndex; j++){
             swap((string + startIndex),(string + j));
             printPermutations(string, startIndex+1, length);
             swap((string+startIndex),(string+j));
          }  
       }    
    }
    

    并将其命名为:

    printPermutations(str, 0, strlen(str));