| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1586 人关注过本帖
标题:想问个新手问题 - 关于字元运用
只看楼主 加入收藏
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:3 
在使用指针char *A这种声明来定义字符串时
常用的有四种选择

char *A = "12345......................................." //直接给字符串赋值 同时确定了A的长度
char *A = NULL //以后用到时再分配内存空间 A长度未定
char *A = calloc(256 * sizeof(char)) //分配内存并初始化了字符串 A为空字符串 可以存储256个字符 使用完了要记得free
char *A = a //char a[256] = {0} //字符串a已经被初始化了 A指向了a

无论哪一种 只要使用了指针 都要注意不能越界

Only the Code Tells the Truth             K.I.S.S
2015-01-19 22:34
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
以下是引用TonyDeng在2015-1-19 22:02:11的发言:

C的千年困擾,就是指針。


C的绝对优势也是指针,成也指针败也指针。快但是又危险。

不要選我當版主
2015-01-20 10:09
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
以下是引用longwu9t在2015-1-19 22:34:58的发言:

在使用指针char *A这种声明来定义字符串时
常用的有四种选择

char *A = "12345......................................." //直接给字符串赋值 同时确定了A的长度
char *A = NULL //以后用到时再分配内存空间 A长度未定
char *A = calloc(256 * sizeof(char)) //分配内存并初始化了字符串 A为空字符串 可以存储256个字符 使用完了要记得free
char *A = a //char a[256] = {0} //字符串a已经被初始化了 A指向了a

无论哪一种 只要使用了指针 都要注意不能越界


这些我都知道。
但上述有一个疑问,若副程式动态配置了内存空间,使用后理论上变量的生命周期应该是只在该副程式运行完毕前,
除非有做返回,不然除了要培养好习惯外,这样free不free有差吗?

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


是指針亂指造成的覆蓋。


但是通常我只需要把出问题的变量或阵列或结构,写声明的位置稍做改变,这问题就会解决了,这也是指针乱指所造成的吗?

不要選我當版主
2015-01-20 10:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是的,就是指針亂指造成的。你所謂的解決,在暫時的,在其他野指針沒有指向這些位置并覆蓋數據的情況下,是沒有錯誤,正因爲不是必然的,所以才是野指針。偶然出現的叫bug,如果總是錯誤,在調試階段就已經發現并改正了,就是因爲偶然能通過,才讓你找不到問題的真正原因。出錯的概率越小,問題越難改正。

每次出現問題,你就稍做改變,然而過後又再出現,於是你又再稍做改變,永遠沒個完,這叫“解決”麽?解決了的問題是不需要再修改程序的!
收到的鲜花
  • wube2015-01-21 12:10 送鲜花  5朵   附言:我很赞同

授人以渔,不授人以鱼。
2015-01-20 21:30
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
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:0 
首先,我反对空对空的纯理论对白;
其次,好像楼主混淆了动态分配的堆空间和指向它的指针变量,指针变量的生命周期结束于函数的结束,这个问题不大,但是没有free的动态空间的生命周期是到进程结束啊,很可能造成函数结束以后申请的空间仍然存在但是没有指针去引用它了。
收到的鲜花
  • wube2015-01-21 12:11 送鲜花  5朵   附言:我很赞同

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2015-01-21 11:03
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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
跟生命周期沒太大的關係。現在你的問題是數據被覆蓋,那是有別的東西在向數據所在的位置寫内容造成的,不是數據自己的問題。你要明白指針是什麽:指針就是一個指示器,它指向某個地方,告訴別人那裏有數據,對同一個地方(比如房屋,數組就好比房屋,在開闢空間時建好了房子,是沒那麽容易移動的,尺寸也是一定的,房屋也衹能有一間),可以有多個指針指向它!你開闢一個數據空間的時候,不管是用數組還是内存分配得到空間入口指針,都是你自己知道的,但問題是另外的人(這裏另外的人其實也包括你自己,在寫程序到一定規模時自己經常忘記在什麽地方做過什麽事,所以寫程序的規範要求你寫每一個功能要自我封閉和保護、還原現場,防止他人無意的破壞以及注意不要破壞他人環境)可能不知道這個位置有數據,他用一個自己的指針指向了這裏内部的某個位置,去刷寫數據。還是房屋的模型,指針猶如名片,每個人都可以憑名片去拜訪這所房屋,甚至住入其中一個房間,張三有一張名片,李四也可以有,他們的名片可能是同一房間,於是他們憑著名片入住,後進去的就把先進去的趕走,這就是數據覆蓋現象。

爲什麽要面向對象?面向對象就是要求每個人,拜訪和入住房間的時候,都要經過前臺核實和批准、分配,有一個統一的管理入口。張三、李四拿著名片去入住,可以,但你要先到前臺問過,能不能實際入住,不是你說了算,這樣就能預防數據被覆蓋的問題。C的指針,就是隨便都可以去刷寫的,關鍵是你寫程序,用某個指針去寫數據的時候,自己有沒有檢查核實機制,那個位置是不是已經有數據?是不是可以往裏面寫數據?

就算你用全局數據,用指針也可以指向它,也一樣可以把數據覆蓋掉。所以問題的根本原因是你無法阻止多個指針指向用一個地方,而且也無法阻止每個指針的持有者獨立去刷寫數據。人家面向對象的思想不是憑空而來的,就是長期編程實踐經驗總結出來,的確有這種問題,而提出的控制手段。當然,C的崇拜者反對限制,不願意前臺登記,喜歡自由自在,隨便入住,說那些手續浪費時間和資源,所以要社會安定、平穩運作,全部靠自覺,這就是C要求程序員自己負全責的真正意思,它把所有責任都推得一乾二净,當然高效,衹不過你寫程序要可靠,得自己把一切該做的補回來,到最後還是一樣的“低效”。
收到的鲜花
  • wube2015-01-21 16:15 送鲜花  10朵   附言:好文章

授人以渔,不授人以鱼。
2015-01-21 12:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
順便說一下,在堆中創建的數據其實就是全局數據。

授人以渔,不授人以鱼。
2015-01-21 15:23
快速回复:想问个新手问题 - 关于字元运用
数据加载中...
 
   



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

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