2015-03-18 2 views
-2

По какой-то причине я получаю ошибку сегмента в строке let [i] = all (4,4, 'a', 'z'); Я не могу понять, почему. Я пытаюсь поместить aaaa-zzzz в массив &, а затем сравнить значения один за другим с зашифрованным паролем. Любые советы помогут. Благодарю. Ive дал два фрагмента кода, которые дают эту проблему.Ошибка сегмента для программы массива C

char* all(int a, int n,char begin, char end){ 
    int i, j; 
    int k = 0; 
    char *c = malloc((n+1)*sizeof(char)); 

    char msg[] = ""; 
    k = strlen(msg); 
    for(i = a; i <= n; i++) 
    { 
     for(j=0;j<i;j++) c[j]=begin; 
     c[i]=0; 
     do { 
     for(int g = 0; g < k; g++) 
      msg[g] = *c; 
     } while(inc(c,begin,end)); 
    } 
    return c; 
    free(c); 
} 

int main(int argc, char* argv[]) 
{ 
    char *result; 
    char **let; 

    int f = open("pass.txt", O_RDONLY); 
    if (f < 0) 
     return 0; 
    char buf[1024]; 
    while (my_fgets(buf, sizeof(buf), f)) 
    { 
     int i = 0; 
      let[i] = all(4,4,'a','z'); 

     result = crypt(argv[i+1], buf); 
     i++; 
     int ok = strcmp (result, buf) == 0; 

     return ok ? 0 : 1; 

    } 
    free(let); 
    close(f); 
} 

Полная программа может быть найдена здесь:

http://pastie.org/10035996

+2

По какой-то причине вы, похоже, разыскиваете неинициализированный указатель. Подсказка: пусть [i]. 'char msg [] =" "' также объявляет массив размером 1, а затем вы пишете прошлое. –

+0

Так что я должен просто позволить [i] и не объявить его для начала? Сожалею. Я новичок в этом. – kids

+0

Это не _сегмент_, это ошибка _сегментации_. – ForceBru

ответ

0

Вы хотите let быть массивом (указатели на отдельные) строк. Вы выделяете пространство для хранения строк, но не для самого массива. Так что, либо объявить:

char *let[MAX_STRINGS]; 

, если у Вас есть максимальное количество строк, известных во время компиляции, или передать его динамически:

let = malloc (sizeof (char *) * whatever_number); 

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

Также обратите внимание, что free(let), который у вас есть прямо сейчас, в вашем коде будет освобождать память только для самого массива, но вам также необходимо освободить отдельные строки до этого. В основном вы должны выполнить free() за каждые malloc(), которые у вас есть в вашем коде.

+0

Я изменил свой знак на char ** let = malloc (sizeof (char *) * 10), но я все еще получаю ошибку сегмента? Я думаю, что это связано с моим let [i] = all (4,4, 'a', 'z') и моим char * c = malloc ((n + 1) * sizeof (char)); @sukkopera – kids

+0

Не могли бы вы объяснить, что именно подразумевается в параметрах 'a' и' n' для 'let()'? С другой стороны, 'free()' after' return' не имеет смысла, удалите его. В любом случае, это никогда не выполняется. – SukkoPera

+0

Параметр - это количество букв, которое начинается с параметра & n, с какими буквами заканчивается. Например, если я сделал все (1,4, 'a', 'f'); он будет идти от a, b, c, d, ... ffff – kids