| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1123 人关注过本帖, 1 人收藏
标题:使用realloc分配不成功,同时加free提示triggered a breakpoint. 请问这是什 ...
取消只看楼主 加入收藏
uswood
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2014-3-29
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:8 
使用realloc分配不成功,同时加free提示triggered a breakpoint. 请问这是什么意思
一个简单的测试动态数组的程序
程序代码:
# include <stdio.h>
# include <malloc.h>

int main(void)
{
    int a[5];
    int * pArr;
    int len;
    int i;

    //创造动态数组
    printf("请输入想要的元素个数:");
    scanf_s("%d", &len);
    pArr = (int *)malloc(sizeof(int) * len);  //开头的pArr本身就是地址变量,不要用int *pArr=... ;
                                              //(int *)强制转换告诉是int类型地址变量,让系统知道按4个字节一个变量分配

    //对动态数组进行赋值
    printf("对元素进行赋值:\n");
    for (i = 0; i < len; ++i)
        scanf_s("%d", &pArr[i]);      //与数组一样的使用方式pArr代表第一个元素地址,*(pArr+1)就是第二个也就是pArr[1]
    
    //对数组进行输出
    printf("一维数组的内容是:\n");
    for (i = 0; i < len; ++i)
        printf("%d\n", pArr[i]);


    //出错,提示triggered a breakpoint.
    realloc(pArr, 100);
    printf("\n%d\n", sizeof(*pArr) );
    free(pArr);                 //释放后pArr所指向的地址的内存不再存在,但pArr所保存的"地址"依然可以存在

    
    return 0;
}



最后修改的时候是重新分配了100个字节,想看看最后是不是确实分配了100个,

1.发现如果加了最后一句free(pArr)会提示triggered a breakpoint,这时候应该已经执行完上面了,这是什么意思啊?
2.删除free后就不会出错,但最后的结果是:

请输入想要的元素个数:2
对元素进行赋值:
3
4
一维数组的内容是:
3
4

4

结果并没有修改字节数,这是为什么呢
搜索更多相关主题的帖子: 动态 
2015-09-13 11:24
uswood
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2014-3-29
收藏
得分:0 
回复 2楼 林月儿
是说的那个a数组吗?但是我是想测试那个动态数组啊 a数组放那应该没有关系啊
2015-09-13 12:01
uswood
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2014-3-29
收藏
得分:0 
回复 4楼 TonyDeng
查到了,我是在视频中看别人这么用的,原来是错的,修改如下:  
pArr=(int *)realloc(pArr, 100);
    printf("\n%d\n", sizeof(*pArr) );

但返回的结果仍然是4..其他部分看了几遍不知道哪里有错,前面也可以正确执行..
2015-09-13 15:32
uswood
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2014-3-29
收藏
得分:0 
回复 6楼 TonyDeng
明白了,最终即便指向那个数组,但实际只保存第一个的地址,而本身转换成了int型所以sizeof会是4。
但如果是这样的话要用什么才能表示那整个动态空间呢?
2015-09-13 20:35
uswood
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2014-3-29
收藏
得分:0 
回复 7楼 erty1001
谢谢建议!学到的时候一定详细看看
2015-09-13 20:36
uswood
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2014-3-29
收藏
得分:0 
回复 10楼 TonyDeng
谢谢! 大体看明白了,后面的realloc()是视频讲解的时候老师说了不详细说,只用画笔随便说了下,没说得太明白,后来看了前面的回帖去查了下就明白了。

第二段也解释了疑惑,就是对于访问动态数组的入口仅仅只有那个首地址,同时存在堆栈的区别,栈一般都有变量名,那么数组就应该属于栈,动态数组就属于堆。
但查了下堆栈,堆是先进先出,由系统控制,栈是先进后出,像一个玻璃杯进水,由程序员控制。
然而在视频中说的是数组是不能由程序员释放,不能更改数组大小等等,先不论堆栈的数据结构问题,只说其中的堆由系统控制(按第二段理解是:动态数组,不存在变量名的属于堆),栈由程序员控制(数组),这样说来存在矛盾了,数组我无法控制,但百科说是由程序员控制,堆我能控制却是由系统控制。不知道怎样才是正确的。

其他的地方都看懂了,试着总结如下:

1.只输出4字节大小的原因:
    sizeof是求对象尺寸的,而在sizeof(*pArr)的语句里面,由于已经声明为int*,即指向的对象为int型,则sizeof求的只会是int的大小,也就是4,而且由于动态数组的入口只有这一个,其他空间也没有变量名(pArr[i]不知道算不算),所以最终还是无法输出动态数组的大小。

2.崩溃的原因:
    使用free崩溃是由于使用realloc()已经改变了首空间的地址,此时再去free已经失效的原地址(即野指针)就会崩溃。

3.有两个危险的地方要注意:
    一个是realloc()扩张有可能改变首地址
    二是同时用几个变量储存一个动态地址的危险
2015-09-14 13:23
uswood
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2014-3-29
收藏
得分:0 
回复 11楼 TonyDeng
学习了!  但“只有在无法用y变量名访问空间的时候,才用指针;”,这句没明白,是指的从别的函数利用指针去修改主函数的变量y吗,访问空间不明白是什么意思
2015-09-14 13:29
uswood
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2014-3-29
收藏
得分:0 
回复 12楼 令狐少侠56
在编辑栏那里有一列功能,里面有个代码的功能,你点一下然后把代码内容放在code标签内就可以了
2015-09-14 13:30
uswood
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2014-3-29
收藏
得分:0 
回复 16楼 TonyDeng
懂了,感谢!受用很大  谢谢!
2015-09-14 21:18
快速回复:使用realloc分配不成功,同时加free提示triggered a breakpoint. 请问 ...
数据加载中...
 
   



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

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