阵列C程序的段故障

时间:2015-03-18 18:27:29

标签: c

出于某种原因,我在行[i] =全部(4,4,'a','z')处得到段错误;我无法弄清楚为什么。我想把aaaa - zzzz放在一个数组和放大器中。然后将这些值逐个与加密密码进行比较。任何建议都会有帮助。谢谢。我已经给出了两个代码片段来解决这个问题。

 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

1 个答案:

答案 0 :(得分:0)

您希望let成为(指向各个)字符串的数组。您正在为字符串分配存储空间,但不为数组本身分配存储空间。所以,要么声明:

char *let[MAX_STRINGS];

如果您在编译时已知最大字符串数,或者动态分配它:

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

在这两种情况下,您必须注意不要在输入阶段超过分配数量。如果您希望能够处理任何可能数量的输入字符串,则必须更改数据结构,可能需要更改链接列表,但我想这对您来说是一个高级主题。

另请注意,您现在在代码中拥有的free(let)只会为阵列本身释放内存,但您还需要在此之前释放单个字符串。基本上,您必须为代码中的每个free()执行malloc()