C for循环无法正常工作没有printf

问题描述:

我想列出所有n个数字的排列组合。直到现在,一切似乎都正常,但我遇到了一个非常奇怪的行为有了这个代码:C for循环无法正常工作没有printf

int **liste_permutations(int n){ 
    int i, fact = factorielle(n); 
    int **tab=malloc(sizeof(int*)*fact); 
    for(i=0; i<fact; ++i) 
    { 
      tab[i] = malloc(sizeof(int)*n); 
    } 
    for(i=0;i<n;++i) 
    { 
      tab[0][i] = n-i; 
    } 

    for(i=1;i<fact;++i) 
    { 
      tab[i] = next_permutation(tab[i-1], n); 
    printf(" "); 
    } 
    return tab;} 

的这个主()

int **tab; 
    tab = liste_permutations(3); 
    for(i=0; i<factorielle(3); ++i) 
    { 

      for(j=0; j<3; ++j) 
      { 
        printf("%d", tab[i][j]); 
      } 
      printf("\n"); 
    } 

输出是

  321 
    231 
    213 
    312 
    132 
    123 

,但如果我将其更改为

int **liste_permutations(int n){ 
    int i, fact = factorielle(n); 
    int **tab=malloc(sizeof(int*)*fact); 
    for(i=0; i<fact; ++i) 
    { 
      tab[i] = malloc(sizeof(int)*n); 
    } 
    for(i=0;i<n;++i) 
    { 
      tab[0][i] = n-i; 
    } 

    for(i=1;i<fact;++i) 
    { 
      tab[i] = next_permutation(tab[i-1], n); 
    } 
    return tab;} 

的输出主要是:

321 
231 
321 
231 
321 
231 

如果我尝试这样做,N = 5为例,(因为它试图输出125““大概)

这里是next_permutation代码的输出是空白:

int *next_permutation(int *t, int n){ 
    //printf("n = %d\n", n); 
    int i, max, count; 
    for(i=0;(i<n) && (max !=i); ++i) 
    { 
      if(t[i] == n) 
      { 
        max = i; 

      } 
      if(t[i] == (t[i-1]+1)) 
      { 
        ++count; 
        if(count == (n-1)) 
        { 
          return NULL; 
        } 
      } 

    } 
    //printf("max = %d\n", max); 
    if(n==1) 
    { 
      //printf("n=1\n"); 
      return NULL; 
    } 
    int *next = malloc(n); 
    if(max == n-1) 
    { 
      //printf("max == n-1\n"); 
      int *s; 
      s = malloc(sizeof(int)); 
      for(i=0; i<(n-1);++i) 
      { 
        s[i]=t[i]; 
      } 
      for(i=0; i<n-1; ++i) 
      { 
        //printf("%d", s[i]); 
      } 
      //printf("\n"); 
      s = next_permutation(s, n-1); 
      if(s == NULL) 
      { 
        //printf("NUUUUUUl"); 
      //  next = NULL; 
        return NULL; 
      } 
      //printf("reprise en n = %d\n", n); 
      for(i=1;i<n;++i) 
      { 
        next[i] = s[i-1]; 
      } 
      //printf("\n"); 
      free(s); 
      next[0]=n; 
      return next; 
    } 
    else 
    { 
      //printf("max != n-1\n"); 

      for(i=0; i<n; ++i) 
      { 
        next[i] = t[i]; 
      } 
      int tmp = next[max]; 
      next[max] = next[max+1]; 
      next[max+1] = tmp; 
      for(i=0;i<n;++i) 
      { 
        //printf("%d", next[i]); 
      } 
      //printf("\n"); 
      return next; 
    }} 

编辑:修改了什么2第一个评论说,但我仍然有山姆问题。

编辑2:谢谢你帮助我的每一个人!特别是mweerden谁给我指出了正确的道路(这是因为计数是未初始化的)!

+1

你的'next_permutation'代码正在向右和向左泄漏内存,更不要说'liste_permutations'中的所有初始分配:它们在重新赋值后也不见了。你不应该每次分配一个新的数组,你应该传递一个现有的数组作为结果,例如'next_permutation(tab [i],tab [i-1],n)' – dasblinkenlight

+0

你想使用调试器来跟踪代码来学习究竟是怎么回事。 – alk

+1

因为你是新来的,我想给你一点提示。如果其中一个答案解决了您的问题,您应该接受该答案作为正确答案。要接受答案,您可以点击表决按钮下方的小复选标记。这既增加了你的声誉,也增加了帮助你的人的声誉。 – Asthor

tab[i] = malloc(sizeof(int*)*n); 

tab[i]想要的int秒的数组(不是int*秒的阵列)

更改为

tab[i] = malloc(sizeof(int)*n); 

而且

int *s; 
for(i=0; i<(n-1);++i) 
{ 
    s[i]=t[i]; 
} 

你不为预留空间s(使用未初始化)

+1

谢谢,我改变了它,但仍然有相同的行为... 无论如何,谢谢你,我刚刚赢得了更好的音符,因为你! –

这里有很多错误。你开始好:

int **tab=malloc(sizeof(int*)*fact); 

但这是错误的:

for(i=0; i<fact; ++i) 
{ 
    tab[i] = malloc(sizeof(int*)*n); 
} 

它应该是:

tab[i] = malloc(sizeof(int)*n); // int, not int * 

然后,你next_permutation循环:

for(i=1;i<fact;++i) 
{ 
    tab[i] = next_permutation(tab[i-1], n); 
    printf(" "); 
} 

您已经已被分配到上面的- 在这里你再做一次?

此外,在next_permutation本身,你有下面这行:

if(t[i] == (t[i-1]+1)) 

的问题是,i可以0 - 索引t[-1]是不是你想要做什么!

printf语句具有这种效果的原因是因为你使用的是可变max尚未初始化:

int i, max, count; 
for(i=0;(i<n) && (max !=i); ++i) 

当你不初始化它,将其值所剩下的有通过其他代码,当这段内存是上次使用。如果您没有printf声明,则该值将是上一次致电next_permutation时所留下的任何值。如果printf在那里,则该值将是由printf调用留下的某个值。除第一次致电next_permutation外,其余值为malloc