一个结构数组的问题,求解答

我发现 当我编辑其他analyze[i].apower[j]的值时,analyze[0].apower[j] analyze[1].apower[j]的值会自动改变
动态数组的值会自动改变吗???
(这种情况不会每次都发生,是不是会来一次,需要多测几次)
以下是代码和一次运算的结果(中间跳过了一些行,关键部分已标出)
为什么我在处理i=2 的情况,依然改变了i=0时的值
ps 这个程序大致目标是把一个数拆成2的幂

#include 
#include
#include
#include
#define RAND_MAX INT_MAX
using namespace std;

int main()
{
    int nbheap,i,j,nb0,nbrm,numheap,limt,k;
    cin>>nbheap;
    int* heap=new int [nbheap];
    nb0=0;
    srand(time(NULL));
    //cin>>limt;
    for (i=0;i<nbheap;i++)
        heap[i]=rand()%100+1;

    for (i=0;i     for (i=0;i     cout     int biggest=heap[0];
    for (i=1;ibiggest) biggest=heap[i];

    int power,max_1=0;
    i=0;

    while (1==1)
    {
     if ((biggest>=pow(2,i))&&(biggest<pow(2,i+1))) break;
     else i++;
    }
   cout<<biggest<<endl;
   max_1=i;
   cout<<max_1<<endl;

   struct structure
  {
    int num,num1;
    int max_index=0;
    int* apower=new int[max_index+1];
  };
  int* powertotal=new int[max_1+1];
  structure* analyze=new structure[nbheap];
  for (i=0;i<nbheap;i++) analyze[i].max_index=max_1;
  for (i=0;i<nbheap;i++) analyze[i].num=heap[i];
  for (i=0;i<nbheap;i++) analyze[i].num1=heap[i];
  for (i=0;i<nbheap;i++)
    for (j=0;j<max_1+1;j++)
     analyze[i].apower[j]=0;
  for (i=0;i<nbheap;i++)
    {
      cout<<"i="<<i<<" 当前:"<<analyze[i].num1<<endl;
      for (j=0;j<max_1+1;j++)
        cout<<"2^"<<j<<":"<<analyze[i].apower[j]<<"   ";
      cout<<"\n";
    }

   power=0;
   for (i=0;i    for (i=0;i    {
    while (analyze[i].num1!=0)
     {
     cout        for (j=0;j             cout              cout        for (j=0;j             cout              cout              cout        if (analyze[i].num1>=pow(2,power)&&analyze[i].num1<pow(2,power+1))
        {
          cout<<"if:  ";
          cout<<"i="<<i<<" 当前:"<<analyze[i].num1<<" power="<<power<<" "<<endl;
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[0].apower[j]<<"   ";
             cout<<"\n";
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[1].apower[j]<<"   ";
             cout<<"\n";
          analyze[i].apower[power]++;
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[0].apower[j]<<"   ";
             cout<<"\n";
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[1].apower[j]<<"   ";
             cout<<"\n";
          analyze[i].num1=analyze[i].num1-pow(2,power);
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[0].apower[j]<<"   ";
             cout<<"\n";
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[1].apower[j]<<"   ";
             cout<<"\n";
          powertotal[power]=powertotal[power]+1;
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[0].apower[j]<<"   ";
             cout<<"\n";
             cout<<"\n";
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[1].apower[j]<<"   ";
             cout<<"\n";
              cout<<"\n";
          power=0;
        }
       else
       {
            cout<<"else:  ";
            power++;
            cout<<"i="<<i<<" 当前:"<<analyze[i].num1<<" power="<<power<<" "<<endl;
            for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[0].apower[j]<<"   ";
             cout<<"\n";
          for (j=0;j<max_1+1;j++)
            cout<<"2^"<<j<<":"<<analyze[1].apower[j]<<"   ";
             cout<<"\n";
              cout<<"\n";
       }
     }
  }
  for (i=0;i<max_1+1;i++)
    cout<<"2^"<<i<<":"<<powertotal[i]<<"   ";
 cout<<"\n";
 cout<<"\n";
  cout<<"\n";
   cout<<"\n";
for (i=0;i<nbheap;i++)
{
    cout<<analyze[i].num<<": ";
    for (j=0;j<max_1+1;j++)
     cout<<"2^"<<j<<":"<<analyze[i].apower[j]<<" ";

3个回答

struct structure
{
int num,num1;
int max_index=0;
int* apower=new int[max_index+1];
};
int* powertotal=new int[max_1+1];
structure* analyze=new structure[nbheap];
你定义analyze的时候用new 统一申请了空间,而结构体里面,在构建的时候int* apower=new int[max_index+1],这时也统一申请了空间切max_index=0,之后当你
for (i=0;i<nbheap;i++) analyze[i].max_index=max_1;的时候,并没有改变int* apower=new int[max_index+1]的空间,因为已经在 structure* analyze=new structure[nbheap];的时候订好了,需要重新为analyze[i].apower =new int[max_index+1]。所以在下面遍历apower的时候超出了apoer数组边界,但你的结构体数组又是申请的连续空间,所以超出之后影响到了其他analyze的值

GGBomb2
GGBomb2 回复Lauibo: new 操作是申请内存空间,这里所说的动态是指程序在编译时才定义空间大小,而不是编译前就定义好了空间大小。如果要实现你所说的动态是在程序运行的时候动态改变分配的内存大小,必须在赋值给max_index的时候,添加代码让apower重新申请内存空间
2 年多之前 回复
Lauibo
温柔的玉米 大神,谢谢,刚开始编程比较迷茫:) 有一个小问题 使用指针是,new创建的数组不是会随动吗 为什么max_index赋值为max_1的时候,apower分到的内存没有响应改变呢?
2 年多之前 回复

执行单步调试,看看哪里出了问题,估计就是你变量的初始化的时候或者内存的位释放的问题了

 struct structure
{
    int num,num1;
    int max_index=0;
    int* apower=new int[max_index+1];
};

结果能这样写??

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问