| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1586 人关注过本帖
标题:想问个新手问题 - 关于字元运用
取消只看楼主 加入收藏
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
以下是引用TonyDeng在2015-1-20 21:30:53的发言:

是的,就是指針亂指造成的。你所謂的解決,在暫時的,在其他野指針沒有指向這些位置并覆蓋數據的情況下,是沒有錯誤,正因爲不是必然的,所以才是野指針。偶然出現的叫bug,如果總是錯誤,在調試階段就已經發現并改正了,就是因爲偶然能通過,才讓你找不到問題的真正原因。出錯的概率越小,問題越難改正。

每次出現問題,你就稍做改變,然而過後又再出現,於是你又再稍做改變,永遠沒個完,這叫“解決”麽?解決了的問題是不需要再修改程序的!


感觉越来越接近问题核心了,大概知道所指野指针的意思,你说的其实也曾经有人说过,但是知道归知道,却不知道问题的根源.
不懂哪些情况会造成野指针?

1.虽说内存分配后没释放有可能,但是如我上面所说的,生命周期结束后,虽没释放但该指针也失去意义.(甚至重新指定指针时,针对新指针内空间的值清空)
2.或如上有人说过的把A指针地址指给B之类的,但是作用影响范围应该也不会牵连到其他变量吧.
3.不知道还有其他的吗?

所以依此说来,要尽量避免出现野指针最好但消极的做法,是尽量少声明各式变量,而从头到尾使用一个全局大型静态结构体或阵列,
而内存空间从程式一开始就全部固定配置了,好像这样就可以避免了吗?

不要選我當版主
2015-01-21 10:40
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
以下是引用forever74在2015-1-21 11:03:15的发言:

首先,我反对空对空的纯理论对白;
其次,好像楼主混淆了动态分配的堆空间和指向它的指针变量,指针变量的生命周期结束于函数的结束,这个问题不大,但是没有free的动态空间的生命周期是到进程结束啊,很可能造成函数结束以后申请的空间仍然存在但是没有指针去引用它了。



意思是即使周期结束,指针失去意义,但是程式没告知系统,系统依然会锁定该申请过的空间,导致可申请的空间越来越少,然后出现不可预知道状况或错乱.
所以问题在指针映射的空间而不在指针.原来所谓野指针就是指这个.

可是空间不足跟资料被覆盖之间又是什么关系?

[ 本帖最后由 wube 于 2015-1-21 12:09 编辑 ]

不要選我當版主
2015-01-21 12:05
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
没学多久,只想到这样故意恶搞的写法会改到值,让两个指针只到同一个地方。
硬要改写还会遇到'const int' to 'int *'的问题.
程序代码:
    
        int A[10]={0};
    for (int i=0;i<10;i++)
        A[i]=i;
    printf("%d , %d\n",A,A[5]);
    int *B=&A[5];
    *B=9000;
    printf("%d , %d ,%d\n",A,B,A[5]);
    return 0;

程序一大,确实会没法面面俱到,通常一个循环检查前数十笔过就让他跑了,而错误都会在几十万次或百万次之中突然跳一次,很烦.
不过一般写程序不可能故意把程序写到错乱,所以追根究底可能是习惯问题,造成语法正常,程序逻辑也正常,但是却出现异常状况,至于前台是指什么?
该不会是在说用Class里的窗口统一申请和释放内存?

不要選我當版主
2015-01-21 16:08
快速回复:想问个新手问题 - 关于字元运用
数据加载中...
 
   



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

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