2016-09-21 2 views
1

Я получаю сообщение об ошибке «Ошибка сегментации (сбрасывание ядра)» при запуске этой программы. Я новичок в программировании 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); 
    } 
} 
+0

не забудьте освободить выделенные данные в конце, используя 'свободный()' – Cherubim

+0

при компиляции, всегда включайте все предупреждения, затем исправить эти предупреждения, которые выводятся компилятором. (для 'gcc', при минимальном использовании:' -Wall -Wextra -pedantic' Я также использую: '-Wconversion' std = gnu99') – user3629249

+0

для удобства чтения и понимания: 1) отдельные блоки кода (для, если, else, while, do ... while, switch, case, default) через пустую строку 2) последовательно отступать код. никогда не используйте вкладки для отступов, так как каждый текстовый редактор/редактор имеет ширину табуляции/ширину табуляции, установленную для личных предпочтений. Предложите использовать 4 пробела для каждого уровня отступов, поскольку он достаточно широкий, чтобы быть видимым даже с шириной переменной ширины, и по-прежнему позволяет использовать многие уровни отступа на странице – user3629249

ответ

2

Ваша проблема заключается в том, что getPermutations называет себя бесконечно. Вам нужно передать что-то дополнительное, чтобы он мог знать, когда остановиться. Как есть, он просто называет себя снова и снова, пока у вас не будет переполнения стека.

Также у вас есть установка getPermutations, чтобы вернуть char**, но тогда вы никогда ничего не возвращаете. Так что это тоже странно.

+0

, что бы я мог отправить к нему? –

+0

@TylerJosephDominick Вы можете дать ему начальное значение для 'startIndex'. Тогда каждый раз, когда вы называете это, вы делаете это так: 'getPermutations (startIndex + 1, string);' Я понятия не имею, делает ли это то, что вы хотите, но по крайней мере это не будет работать вечно. Вы использовали рекурсию раньше? – michalska7

+0

Я нахожусь в своем третьем семестре студентом-информатике, я знаю о рекурсии, и я хорошо знаком с программированием на Java, но класс, который я сейчас принимаю, все в программировании на языке программирования, и поэтому я довольно сильно потерял целые память распределение предмет. Не говоря уже о том, что каждый раз, когда я прошу своего профессора взглянуть на мой код, он говорит мне, что я должен сам разобраться и ответить на этот вопрос. В основном мое назначение - создать программу в c, которая возвращает список перестановок из строкового аргумента. –

1

Мои предложения:

  1. Изменить тип возвращаемого значения функции для void, поскольку он не возвращает ничего.

  2. Измените имя функции на printPermutations, так как она просто печатает перестановки.

  3. Обеспечить способ завершения рекурсии. Пройдите startIndex в качестве аргумента.

  4. Пропустите длину строки, чтобы вы не вычисляли ее каждый раз, когда функция вызывается рекурсивно.

  5. Измените оператора сравнения на >= для учета строк с нулевой длиной.


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)); 
+0

@R Sahu Я бы внес эти изменения, но мое назначение выглядит следующим образом: «Используйте код C для записи функции (части API) с сигнатурой char ** getPermutations (char *), которая, когда задана строка, возвращает все перестановки входной строки. " Я просто пытался напечатать их по очереди, чтобы начать работу, и, надеюсь, увидим, что я на правильном пути –

+1

@TylerJosephDominick, что потребует некоторого обучения с вашей стороны. Вы должны выяснить, что необходимо для выделения массива указателей и как выделить память для строк, на которые указывают эти указатели. Это не сложно, но это может быть склонно к ошибкам. Удачи. –

+0

@R Sahu Спасибо, есть ли у вас какие-либо рекомендации о хороших ресурсах для поиска информации, которую я ищу? Я чувствую себя полностью потерянным. –