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

 
 
 
日一二三四五六
       
       
       
       
       
       

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

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

本吧签到人数:0

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

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

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

关于动态分配内存上的问题

  • 只看楼主
  • 收藏

  • 回复
  • Visionary__
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
因为不想使用realloc 所以就用calloc自行解决,以前也没问题,但是今天旧出了个奇怪的问题


  • Visionary__
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这是运行时候的报错,编译是直接通过的;
a.out: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)* failed.
已放弃


2025-07-24 21:57:31
广告
不感兴趣
开通SVIP免广告
  • Visionary__
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
源码比较长,以下是截取 可能有些个人的东西,大家旧完全按照表面意思理解就好;
//插入元素
void insert_v(Vector *v,int index, ElementType *e)
{
assert(v!=NULL);
if(index<1||index>v->counter+1)
{
printf(" index error\n");
exit(1);
}
if(e==NULL)
{
printf("element error!\n");
exit(1);
}
if(v->counter==v->max)
{
v->max+=5;
printf("max 1 :%d\n", v->max);
ElementType *a=(ElementType *)calloc(v->max, sizeof(ElementType));
printf("max 2 :%d\n", v->max);
if(a==NULL){
fprintf(stderr, " relloc:%s\n", strerror(errno));
exit(1);
}
/*int i;
for(i=0;i<v->counter;i++)
{
a[i]=v->elem[i];
printf("a[i]:%d,elem[i]:%d\n", a[i], v->elem[i]);
}*/
// memcpy(a,v->elem,v->counter);
// free(v->elem);
// v->elem=a;
}
int i;
if(v->counter>=1)
for(i=v->counter+1;i>=index;i--)
v->elem[i]=v->elem[i-1];
v->elem[index-1]=*e;
v->counter++;
return;
}


  • Visionary__
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这是一个顺序表的数据结构 大概就是动态分配一维数组;
报错是在 元素满了的 时候 重新calloc的时候;
在别人的电脑上是可以运行的;
在我的电脑上就会报那个错。
用gdb调试报的错如下;
Reading symbols from ./a.out...done.
(gdb) l
1 #include "vector.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 int main()
6 {
7 int a[]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
8 Vector *v=create_v();
9 int i=1;
10 for(;i<=11;i++)
(gdb) l
11 insert_v(v,i,a+i-1);
12 query(v);
13 return 0;
14
15 }
(gdb) l
Line number 16 out of range; src/vector_test.c has 15 lines.
(gdb) l
Line number 16 out of range; src/vector_test.c has 15 lines.
(gdb) l
Line number 16 out of range; src/vector_test.c has 15 lines.
(gdb) r
Starting program: /home/ck/creviewing/datastru/a.out
//这里是错无的开始
a.out: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)* failed.
Program received signal SIGABRT, Aborted.
0x00007ffff7a4af79 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: 没有那个文件或目录.


  • Visionary__
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
各位 有什么解决途径,望不吝赐教。


  • 闲云流水he
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
内存错误最难查了,删代码,吧错误局限在最少语句中。一般就是你处理错了,不是什么你理解上的问题。


  • Visionary__
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没有大神嘛


  • 武盟仰望
  • 马猴烧酒
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
删代码
缩小错误的范围
溢出之类的内存错误本来就有随机性
这台计算机上可能溢出一字节就崩了
另一台计算机可能往后写1M的数据也不会崩


登录百度账号

扫二维码下载贴吧客户端

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