C 分段故障(内核转储)分配内存?
当我运行这个程序时,我得到了错误“分段错误(核心转储)”。我是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
#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));