网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
03月04日漏签0天
c语言吧 关注:801,823贴子:4,376,464
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 22回复贴,共1页
<<返回c语言吧
>0< 加载中...

动态数组追加元素的问题 求指点 求更好方法

  • 只看楼主
  • 收藏

  • 回复
  • yhb362
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在数组使用大多数情况都是事先分配好了内存、
例如:我要10元素,于是一一开始就分配 int *p = (int) malloc ( sizeof ( int )* 10 )
但是用到后发现我要用11个元素,但不是能保证 p地址后的第11个的内存空间是否可用,
于是我只好写个函数 重新分配 11个元素内存 把原先的0个元素数据拷贝进去,把新的数据加入到里面
接着把
int * 追加元素(原始数组 *p, int 追加数据)
{
int *p1 = (int) malloc ( sizeof ( int )* 11 )
后面的省略......................................
return p1 ;
}
int *pt = NULL;
pt = 追加元素(原始数组 *p, int 追加数据);
free ( p ) ; 释放原始数组的内存
p = p1; 防止后面代码写错,于是后面又可以用p了
有没有其他方法


  • BlueWanderer
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一般会多申请一点。另外如果插入压力很大的话可以做成二级的。


2026-03-04 20:49:35
广告
不感兴趣
开通SVIP免广告
  • 伊斯坦布尔选帝侯
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
改变大小使用realloc函数,内容会自动处理
另外你可以一个指针指向数组,一个整型存长度,两个做成结构体


  • 一名高中生sky
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顶,一个


  • yhb362
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@BlueWanderer
上了趟厕所,想明白了你说的,二级指针是多分配几个内存,然后要用时在分配内存,
,用在字符串数组的话,确实很管用,
但int 型的话都是4字节,还如一开始多分配几个、但这样的话又没达到我想要的目地


  • 814865841
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
malloc那里错了吧 应该用int*强制转换类型


  • 妥善又奇巧丶mml
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没有


  • 814865841
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
另外 我是用realloc的。。很好用


2026-03-04 20:43:35
广告
不感兴趣
开通SVIP免广告
  • blushadow
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
用块状链表吧……每个结点一个数据,用动态结点串起来……既能保证灵活性,又能保证随机存取的性能……


  • yhb362
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@814865841 @Xelnagaman
我看了一下realloc这函数介绍如下:
判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将
mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头
到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针
是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器
块的地址。
看完后我明白了。。他其实就是封装了我上面写的函数,如果在我的代码前面写几行判断下
当前指针后面的所需新增内存大小的空是否可用的话,如果可用直接增加,如果不可用就重
新分配,并把释放原数组的代码放到封装函数里的话 。就完全一样了


  • 妥善又奇巧丶mml
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
庸人自扰


  • 妥善又奇巧丶mml
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这看你是否需要一个连续的数组。如果需要,只有一楼的方法。如果不需要,那种方法也无所谓。
以 p+n 的方式访问数组,数组必须是连续的,也就是p+0 ,p+1他们之间,是不能有间隙的。
以 p[n][x];的方法访问数组,可能会有间隙。也就是p[][]不能转为p+0的形式。(二维转一维)
你可以使用一个指针数组,在需要时调用realloc,来增加空间。以二维数组的形式使用。
当然,你也可以使用链表来增加空间。
其实最简单的方法就是,借助虚拟内存来申请一个巨大无比的单维数组。
如;int a[9999999999999999];
好处是,不用写代码即可轻松完成,而且既多又好 。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 22回复贴,共1页
<<返回c语言吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示