注册 登录
编程论坛 C++教室

正确的程序,但不能运行应如何修改?

yxb0001 发布于 2009-09-23 13:43, 993 次点击

#include<iostream.h>
#include<stdlib.h>

int a[20]={2,0,6,23,41,0,5,6,0,99,33,22,0,12,67,0,9,3,6,23};
int *p,i,j=0;
int **y;

int main()
{
    y = (int **)calloc(20,sizeof(int *));

    p=&a[0];
     
    for(i=0;i<20;i++)
    {
        if(*(p+i)!=0)
        {
            *(y+j)=p+i;
            
            cout<<**(y+j)<<" ";

            j++;
        }
    }
    cout<<"\n";
   
    for(i=0;i<=j;i++)
    {
        if(i>2)
        {
            while(**(y+i)>**(y+i-1) && **(y+i-1)>**(y+i-2))
            {
                cout<<**(y+i)<<" ";break;
            }
        }
    }
   
    return 0;
}

运行后没有结果,屏幕显示指令引用的内存不能为"read",请问如何修改?








[ 本帖最后由 yxb0001 于 2009-9-23 15:11 编辑 ]
10 回复
#2
gz812009-09-23 13:46
我运行没问题,编译环境:Code::Blocks,显示结果:

2 6 23 41 5 6 99 33 22 12 67 9 3 6 23 请按任意键继续. . .


[ 本帖最后由 gz81 于 2009-9-23 14:00 编辑 ]
#3
yxb00012009-09-23 13:51
上部分运行没有问题,但下面加了一点东东,运行就有问题了。这些东东如下:

for(i=0;i<=j;i++)
    {
        while(**(y+i)>**(y+i-1) && **(y+i-1)>*(y+i-2))
        {
            cout<<**(y+j)<<" ";
        }
    }


[ 本帖最后由 yxb0001 于 2009-9-23 14:29 编辑 ]
#4
gz812009-09-23 14:05
以下是引用yxb0001在2009-9-23 13:51的发言:

上部分运行没有问题,但下面加了一点东东,运行就有问题了。这些东东如下:

for(i=0;i<=j;i++)
    {
        while(*(y+i)>*(y+i-1) && *(y+i-1)>*(y+i-2))
        {
            cout<<**(y+j)<<" ";
        }
 ...
i为0时,y+0-1,明显是越界……

[ 本帖最后由 gz81 于 2009-9-23 14:15 编辑 ]
#5
yxb00012009-09-23 14:25
即使改为下面也一样,估计不是越界这个问题。 (所加东东有点笔误,已修改过来)
for(i=0;i<=j;i++)  
    {  
       if(i>=2){
         while(**(y+i)>**(y+i-1) && **(y+i-1)>**(y+i-2))  
         {  
            cout<<**(y+j)<<" ";  
         }  
        
        }
}
 
我想实现的功能是:在数组a中除0处的元素组成的新数组中(原来的地址不变),如果按顺序的三个数存在a>b>c的关系,则显示a。

[ 本帖最后由 yxb0001 于 2009-9-23 14:31 编辑 ]
#6
gz812009-09-23 14:39
我改了一下,请参考:

#include<iostream>
#include<stdlib.h>
using namespace std;
 
int a[20]={2,0,6,23,41,0,5,6,0,99,33,22,0,12,67,0,9,3,6,23};  
 
int main()  
{  
    int j = 0;
    int *p = &a[0];
    int *y = new int[20];
 
    p=&a[0];  
      
    for(int i=0;i<20;i++)  
    {  
        if(*(p+i)!=0)  
        {  
            *(y+j)=*(p+i);  
              
            cout<<*(y+j)<<" ";  
 
            j++;  
        }  
    }
    cout<<"\n";
     
    if (j<2)
        cout<<"元素个数少于三个,不能比较。";
    else
    {
        for (int i=0; i<=j-2; ++i)
        {
            if (*(y+i)<*(y+i+1) && *(y+i+1)<*(y+i+2))
                cout<<*(y+i)<<" ";
        }
 
    }

    delete []y;
     
    return 0;
}


[ 本帖最后由 gz81 于 2009-9-23 16:24 编辑 ]
#7
yxb00012009-09-23 14:51
while这里包含if的过滤功能,过界在此不适应。如下程序可表明此功能:

#include<iostream.h>  
#include<stdlib.h>  
 
int a[20]={2,0,6,23,41,0,5,6,0,99,33,22,0,12,67,0,9,3,6,23};  
int i;
 
int main()
{
    for(i=0;i<20;i++)
    {
     
        while(a[i]>a[i-1] && a[i-1]>a[i-2])
     
        {
            cout<<a[i]<<" ";
     
            break;
        }
    }
    return 0;
}
#8
yxb00012009-09-23 15:07
谢谢!这种方法我会,这个问题主要是想运用指针的指针方法解决。
#9
yxb00012009-09-23 15:20
明白了,是j溢出的原因,for(i=0;i<=j;i++)  改为for(i=0;i<j;i++)即可。指针数组的元素是j个不是(j+1)个。  
#10
智奇CC2009-09-23 15:25
楼上高手吖,支持一下
#11
gz812009-09-23 16:25
噢,还有在堆中申请了内存记得释放掉。
1