大家帮我看一看这个程序的问题在哪里?

时间:2022-09-06 14:15:21
大家帮我看一看这个程序的问题在哪里?函数里输出的数组元素是正确的,可返回指针后,就有5个元素出错,下面是程序。
#include "stdio.h"
unsigned int *getpassword(unsigned int k[9])
{unsigned int i,j,y[57],kk[9],*p;
 for(i=1;i<=8;i++)
  y[i]=k[i];
 for (j=2;j<=7;j++)
 {for(i=1;i<=6;i++)
   kk[i]=(k[i+1]&127)*512+k[i+2]/128;
  kk[7]=(k[8]&127)*512+k[1]/128;
  kk[8]=(k[1]&127)*512+k[2]/128;
  for(i=1;i<=8;i++)
   {k[i]=kk[i];
    y[(j-1)*8+i]=k[i];
   }
 }
 p=&y[0];
 for(j=1;j<=7;j++)
  {for(i=1;i<=8;i++)
    printf("%u ",p[(j-1)*8+i]);
   printf("\n");
  }
 return p;
 }
main()
{static unsigned int k[9]={0,27843,41395,14897,8426,44872,35692,60158,1204};
 unsigned int *q,i,j;
 q=getpassword(k);
 printf("\n");
 for(j=1;j<=7;j++)
  {for(i=1;i<=8;i++)
    printf("%u ",q[(j-1)*8+i]);
   printf("\n");
  }
  printf("\n");
}
下面是输出结果:
27843 41395 14897 8426 44872 35692 60158 1204
26228 25153 54622 37142 55765 64521 26841 34627
33706 48418 11699 44024 4817 45838 34508 59588
17499 26455 61477 41830 7437 39377 35079 21882
45024 19270 52282 6963 41746 3754 62600 46798
36248 29750 26438 9245 21993 4461 40287 49302
27854 35912 15019 53794 56122 49025 11547 12520

27843 41395 14897 8426 44872 35692 60158 1204
26228 25153 54622 37142 55765 64521 26841 34627
6 20481 12338 13107 8247 45838 34508 59588
17499 26455 61477 41830 7437 39377 35079 21882
45024 19270 52282 6963 41746 3754 62600 46798
36248 29750 26438 9245 21993 4461 40287 49302
27854 35912 15019 53794 56122 49025 11547 12520
第三行的前5个出错。

7 个解决方案

#1


你这让我们怎么看?
你先说一下程序的功能啊

#2


你的p指向的是临时数组变量,函数调用后,堆栈会改变,当然会出问题

用传参数的方法来避免:

void getpassword(unsigned int k[9],unsigned int* Y )

#3


p=&y[0];
 for(j=1;j<=7;j++)
  {for(i=1;i<=8;i++)
    printf("%u ",p[(j-1)*8+i]);
   printf("\n");
  }
return p;
****
p是临时nonstatic变量的指针啊!怎么可以返回呢?

#4


他们说的没错。你可以把数组Y定义成static int型的。这样数组内存空间保留,你的数据就可以使用了。不过这样也不是太好。全局变量呢?或者在main函数里定义,然后作为参数传进函数去。
总之你记住,在函数里申请的空间一般是临时的,函数调用结束空间就释放了。所以一般不要返回数组,结构体等复合类型,还有指针。如果需要的话,考虑静态变量,全局变量或者引用以及传递指针。

#5


还是你自己F7一下孔子

#6


他们说得很对,没有补充的了,结账吧,别忘了我。

#7


等我试试看。顺便问一下,怎么结账啊?

#1


你这让我们怎么看?
你先说一下程序的功能啊

#2


你的p指向的是临时数组变量,函数调用后,堆栈会改变,当然会出问题

用传参数的方法来避免:

void getpassword(unsigned int k[9],unsigned int* Y )

#3


p=&y[0];
 for(j=1;j<=7;j++)
  {for(i=1;i<=8;i++)
    printf("%u ",p[(j-1)*8+i]);
   printf("\n");
  }
return p;
****
p是临时nonstatic变量的指针啊!怎么可以返回呢?

#4


他们说的没错。你可以把数组Y定义成static int型的。这样数组内存空间保留,你的数据就可以使用了。不过这样也不是太好。全局变量呢?或者在main函数里定义,然后作为参数传进函数去。
总之你记住,在函数里申请的空间一般是临时的,函数调用结束空间就释放了。所以一般不要返回数组,结构体等复合类型,还有指针。如果需要的话,考虑静态变量,全局变量或者引用以及传递指针。

#5


还是你自己F7一下孔子

#6


他们说得很对,没有补充的了,结账吧,别忘了我。

#7


等我试试看。顺便问一下,怎么结账啊?