Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分段故障(内核转储)分配内存?_C_Memory_Permutation - Fatal编程技术网

C 分段故障(内核转储)分配内存?

C 分段故障(内核转储)分配内存?,c,memory,permutation,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

当我运行这个程序时,我得到了错误“分段错误(核心转储)”。我是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);
    }
}
#包括
#包括
#包括
无效交换(字符*x,字符*y){
字符温度=*x;
*x=*y;
*y=温度;
}
字符**getPermutations(字符*字符串){
int length=strlen(字符串);
int startIndex=0;
int endIndex=长度-1;
if(startIndex==endIndex){
printf(“%s\n”,字符串);
}否则{
对于(int j=startIndex;j2){
printf(“\n参数太多\n”);
出口(0);
}否则{
printf(“%s”,argv[1]);
char*str=malloc(strlen(argv[1])+1);
strcpy(str,argv[1]);
getPermutations(str);
}
}

您的问题是
getPermutations
会无休止地调用自身。您需要向它传递一些额外的内容,以便它知道何时停止。按原样,它只会反复调用自身,直到出现堆栈溢出

另外,您有
getPermutations
设置来返回
char**
,但是您从来不会返回任何内容。这也很奇怪。

我的建议:

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

  • 将函数名更改为
    printPermutations
    ,因为它只打印置换

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

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

  • 将比较运算符更改为
    =
    ,以说明长度为零的字符串



  • 在编译时,不要忘记在最后使用
    free()
    释放分配的数据,始终启用所有警告,然后修复编译器输出的警告。(对于
    gcc
    ,至少使用:
    -Wall-Wextra-pedantic
    我也使用:
    -Wconversion
    std=gnu99`)为了便于阅读和理解:1)单独的代码块(for、if、else、while、do…while、switch、case、default)通过空行2)始终缩进代码。切勿使用制表符进行缩进,因为每个文字处理器/编辑器都为个人偏好设置了制表位/制表符宽度。建议为每个缩进级别使用4个空格,因为即使使用可变宽度字体,也足以看到缩进,并且允许在页面错误消息中使用多个缩进级别es“应该”发送到
    stderr
    ,而不是
    stdout
    ,因此在编写错误消息时,使用:
    fprintf(stderr,…);
    而不是
    printf(…);
    当发现命令行参数有问题时,输出
    用法
    语句,类似于:
    fprintf(stderr,“用法:%s”,argv[0]);
    当前输出不会告诉用户命令行应该是什么。在调用大多数系统函数(例如
    malloc())时,如果不先检查
    argc
    以确保该参数确实存在,则决不能访问
    argv[0]
    以外的区域
    ,始终检查返回值以确保函数成功。我还要向它发送什么?@TylerJosephDominick您可以为它指定
    startIndex
    的初始值。然后每次调用它时,您都会这样做:
    getPermutations(startIndex+1,string);
    我不知道这是否符合你的要求,但至少它不会永远运行。你以前使用过递归吗?我是计算机科学专业的第三学期学生,我知道递归,我对java编程非常熟悉,但我现在上的课都是c编程,所以我对所有的内存都很迷茫位置问题。更不用说每次我让教授看我的代码时,他都让我自己搜索答案。基本上,我的任务是用c语言创建一个程序,返回字符串参数的排列列表。@R Sahu我会做这些更改,但我的任务如下:“使用c代码编写函数。”(API的一部分)带有签名char**getPermutations(char*),当给定一个字符串时,它返回输入字符串的所有排列。”我只是试图一次打印一张来开始,希望看到我是对的track@TylerJosephDominick,这需要您学习。您必须弄清楚分配指针数组需要什么,以及如何为指针指向的字符串分配内存。这并不难,但可能会出错r倾向。祝你好运。@r Sahu谢谢你,你有什么好资源的建议来找到我要找的信息吗?我觉得完全迷路了。@TylerJosephDominick,和。
    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));