数组C程序的段错误

数组C程序的段错误,c,C,由于某种原因,我在线路上得到一个段故障,let[I]=all(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[] =

由于某种原因,我在线路上得到一个段故障,let[I]=all(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);
}
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);

对于(i=a;i您希望
成为一个(指向单个)字符串的指针数组。您正在为字符串分配存储空间,但不是为数组本身。因此,声明:

char *let[MAX_STRINGS];
如果在编译时已知字符串的最大数量,或动态分配:

let = malloc (sizeof (char *) * whatever_number);
在这两种情况下,您必须注意在输入阶段不要超过分配数量。如果您希望能够处理任何可能数量的输入字符串,您必须更改您的数据结构,可能是链接列表,但我想这是目前您的高级主题


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

出于某种原因,您似乎取消了对未初始化指针的引用。提示:let[i]。
char msg[]=“”
还声明了一个大小为1的数组,然后您写入该数组。所以我应该让[i]而不是一开始就声明它?对不起。我是新手。这不是段,这是段错误。我把let改成了char*let=malloc(sizeof(char)*10),但我仍然有段错误?我想这与我的let[I]=all(4,4,'a','z')和char*c=malloc((n+1)*sizeof(char 10))有关@sukkopera您能准确地解释一下
a
n
参数到
let()
的预期含义吗?
free()
return
之后,删除它没有任何意义。它无论如何都不会执行。a参数是它以多少个字母开头,n参数是它以多少个字母结尾。例如,如果我全部执行了(1,4,'a','f');它将从a、b、c、d开始,…FFFFF ULL程序被添加到问题中。然后,您的程序中有太多的问题要在这里讨论。我建议修改整个逻辑。请记住,数组项的编号从0到大小-1(因此开始用I=a填充c[I]并不是从数组的开头开始,而是会溢出)。同时请记住其他人对
char msg[]=”
的看法。祝你好运!