| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1727 人关注过本帖
标题:求助:变长数组和数组越界
只看楼主 加入收藏
逐渐学习
Rank: 6Rank: 6
等 级:侠之大者
帖 子:113
专家分:454
注 册:2010-9-26
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:9 
求助:变长数组和数组越界
在运行线性表插入数据时,程序运行完出现非法操作。
将int a[]={11,22,33,44,55};修改为int a[10]={11,22,33,44,55};就不会出现非法错误。
现在有些头大,请大家多指点几招避免因变长数组引发数组越界而出现非法操作方法。以下是调试代码。

#include <stdio.h>

void Insert(int a[],int &n,int i,int x)
{
  int j;
  //检验插入元素是否合法
  if(i<1 || i>=n+1)
    printf("i值错误!\n");
  else
    {
      //数组元素后移,为插入元素空出位置
      for(j=n-1;j>=i-1;j--)
      {
        a[j+1]=a[j];

      }
      //插入数据元素
      a[i-1]=x;
      //个数加1
      n++;
   
    }

}

int main()
{
    //定义数组
    int a[]={11,22,33,44,55};
    //定义循环变量和数组长度
    int i,n;

    n=5;
    //执行插入操作
    Insert(a,n,3,8);

    //打印数据
    for(i=0;i<n;i++)
    {
        printf("%d,",a[i]);
    }
    printf("\n");
    return 0;

}

[ 本帖最后由 逐渐学习 于 2010-12-22 11:20 编辑 ]
搜索更多相关主题的帖子: 越界 
2010-12-22 11:14
五当家
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:2
帖 子:1112
专家分:3674
注 册:2010-10-20
收藏
得分:8 
你这里的int a[]={11,22,33,44,55};要改成为int a[10]={11,22,33,44,55};是因为你调用子函数后加了一个元素进去,如里定义时写成int a[]={11,22,33,44,55};系统会默认为a是一个有5位元素的一维数组,你后面再加一个元素就会出现错误.而你改为int a[10]的话,你这里a中有10个元素,就你这题而言,是用一个数把第六个元素替代了.

数组一旦定义好了大小,就不能添加或删除元素,只能修改元素.

经验积累中............
2010-12-22 12:22
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:8 
你可以考虑一下动态开辟一个新的数组
数组的长度由你插入数据的个数和数组的元素个数来决定
开辟一个   new int【原数组长度+插入数据个数】
长度的数组  然后进行操作  完成插入

                                         
===========深入<----------------->浅出============
2010-12-22 12:52
逐渐学习
Rank: 6Rank: 6
等 级:侠之大者
帖 子:113
专家分:454
注 册:2010-9-26
收藏
得分:0 
以下是引用五当家在2010-12-22 12:22:58的发言:

你这里的int a[]={11,22,33,44,55};要改成为int a[10]={11,22,33,44,55};是因为你调用子函数后加了一个元素进去,如里定义时写成int a[]={11,22,33,44,55};系统会默认为a是一个有5位元素的一维数组,你后面再加一个元素就会出现错误.而你改为int a[10]的话,你这里a中有10个元素,就你这题而言,是用一个数把第六个元素替代了.

数组一旦定义好了大小,就不能添加或删除元素,只能修改元素.
恩,我感觉定义a[10]数组时候,长度尽可能大些。要是不能知道插入多少数据,还是增加些数量判断,防止出现异常。

帮人《---》帮己
2010-12-22 15:10
逐渐学习
Rank: 6Rank: 6
等 级:侠之大者
帖 子:113
专家分:454
注 册:2010-9-26
收藏
得分:0 
以下是引用laoyang103在2010-12-22 12:52:44的发言:

你可以考虑一下动态开辟一个新的数组
数组的长度由你插入数据的个数和数组的元素个数来决定
开辟一个   new int【原数组长度+插入数据个数】
长度的数组  然后进行操作  完成插入
是用malloc这个吧。如果动态开辟一个新的数组,我感觉像是个链表呢?请指点下。

帮人《---》帮己
2010-12-22 15:24
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:8 
建议用VC++中的方法,创建一个动态数组。
int n;
int *a=new int[n];//这里的n在程序运行可以知道有多少个元素时确定。
a[1]=1
a[2]=2......以后就可以正常使用了。

   唯实惟新 至诚致志
2010-12-22 18:18
马后炮
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:156
专家分:560
注 册:2010-12-17
收藏
得分:8 
2楼就是正解

樱之雪,晓之车
2010-12-22 21:59
逐渐学习
Rank: 6Rank: 6
等 级:侠之大者
帖 子:113
专家分:454
注 册:2010-9-26
收藏
得分:0 
谢谢各位了。

帮人《---》帮己
2010-12-24 09:20
cmarquis
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-4-24
收藏
得分:0 
以下是引用laoyang103在2010-12-22 12:52:44的发言:

你可以考虑一下动态开辟一个新的数组
数组的长度由你插入数据的个数和数组的元素个数来决定
开辟一个   new int【原数组长度+插入数据个数】
长度的数组  然后进行操作  完成插入
嗯,这里不是C语言论坛吗?怎么C++的跑这来了?
2010-12-24 09:38
gavinsurekam
Rank: 2
等 级:论坛游民
帖 子:15
专家分:15
注 册:2010-12-25
收藏
得分:0 
需要实现动态大小,那么需要使用链表是适合的。
这是小弟写的一个份代码:比较简单只是说明链表更适合做动态插入。
同时提出一个问题:【标准输入缓冲区的刷新问题】请参看源码,
有不足之处请指出。
/**
此处对于输入缓存没什么好的解决办法。
只能在标准输入后加getchar()来解决,
有如哪位大虾能有好的方法请qq:153612021

**/
#include<stdio.h>

typedef struct{
    int num;
    struct data *next;
} data;


/**
增加元素
**/
int add (data *head)
{
    data *temp=head ;
    data *d;

    if(head ==NULL)
    {
        printf("head is NULL\n");
        return -1;
    }
   
    if((d =(data *)malloc(sizeof(data)*1))==NULL)
    {
        printf("malloc error\n");
        return -1;
    }
   
    printf("add data ,please input data:\n");
    scanf("%d",&d->num);
    getchar();
   
    d->next=NULL;
   
    while(temp->next){
        temp=temp->next;
    }
   
    temp->next =d;
    return 0;
}

/**
显示链表信息
**/
int display(data *head)
{
    data *temp=head;
    data *d;
   
   
    if(head ==NULL)
    {
        printf("head is NULL\n");
        return -1;
    }
    if((d =(data *)malloc(sizeof(data)*1))==NULL)
    {
        printf("malloc error\n");
        return -1;
    }
   
    printf("NUM\n");
    while(d=temp->next)
    {   
        printf("%d\t",d->num);   
        temp =temp->next;
    }
   
}

/**
主函数:带头节点的链表
**/
void main()
{
    data *head;   
    char y;
        
    if(head =(data*)malloc (sizeof(data))==NULL)
    {
        printf("molloc head error\n");
        exit (-1);
    }
   
    while(1){
        
        printf("DO YOU WANT ADD DATA Y/y TO ADD:\n");
        scanf("%c",&y);
        getchar();//???
        
        if(y=='Y'||y=='y')
        {
            if(add(head)==0)
            {
                printf("add success\n");   
            }else{
                printf("add fail\n");
            }
        }else{
            if(y=='n'||y=='N')
                break;
        }
    }
    display(head);
   
}
2010-12-25 17:02
快速回复:求助:变长数组和数组越界
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022046 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved