| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1509 人关注过本帖
标题:动态内存分配小问题
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
指针的sizeof()尺寸为4,跟它所指向的内存空间sizeof()尺寸是一回事么?有汇编代码你看,你不去看,还说学汇编。

授人以渔,不授人以鱼。
2012-10-31 20:24
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
回复 11楼 TonyDeng
PUBLIC    ??_C@_03POMAGKDD@xyz?$AA@
??_C@_03POMAGKDD@xyz?$AA@ DB 'xyz', 00H
mov    DWORD PTR [eax], OFFSET ??_C@_03POMAGKDD@xyz?$AA@

恩,版主说的是,head->stu_name = “xyz”//"xyz"是常量,可以是任意长度,stu_power 里,char *stu_name 占用的是4字节,只存放所指向常量的地址。。

归根结底,还是我对指针的理解不透彻,

总有人比你努力,可怕的是比你牛的人比你还努力。
2012-10-31 20:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这回对了。指针只是一个储存地址的变量,它的尺寸就是机器字长(32位机上是32位,64位机上是64位),不管它指向什么对象,都是这个尺寸。而且对C/C++来说,指针实际上可以随时指向任意的对象,一会儿指向整数,一会儿你强制它指向浮点数,也是可以的,只要不触犯系统禁忌,就可以运行得“看起来没错误”。你的代码中,让指针stu_name指向一处常量地址(常量"xyz"的静态地址),不是给指针的内容赋值(赋值必须解引用*stu_name),比如你再定义一个常量字符串"abc",过后让std_name指向它,仍然可以,只是变换了指向而已,跟赋值不是一回事。

由于指针stu_name指向了常量"xyz"的地址,所以假如后面试图用scanf("%s", stu_name)给stu_name填入数据,在Windows系统下马上就会出错退出(在DOS下不会,只是有什么后果不知道)。这就是我前面问你是否真的试过给这个指针赋值的原因,可能你的“赋值”概念不正常,以为给指针指向等于给它所指向的数据赋值。

[ 本帖最后由 TonyDeng 于 2012-10-31 21:20 编辑 ]

授人以渔,不授人以鱼。
2012-10-31 21:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
malloc(LEN),确实在堆中分配了12字节的内存,本来stu_name = malloc(),就已经把指针指向了新分配的内存,但你在后面擅自把指针的指向改变了,于是再也找不回新分配的内存的地址,此后无法释放它,造成内存泄漏(在Windows中进程结束后可以替你擦屁股,但在别的系统中你这样做是找死)。使用指针的诸多问题,正是C/C++给程序员带来无数烦恼的第一个原因,也是其他高级语言纷纷回避使用这个概念的根本原因(不是说人家从来不使用指针,而是不让程序员直接使用指针,指针被语言内部使用)。初学者,总是被指针神话欺骗,急于接触和使用指针,结果错误频频,打击自信心,在这里不断碰钉,只能干扰语言其他方面的学习。我历来最反感初学者为用指针而用指针编程的做法,可以说是一无是处。

授人以渔,不授人以鱼。
2012-10-31 21:13
信箱有效
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1102
专家分:4268
注 册:2012-6-19
收藏
得分:0 
跟着一块学习指针
2012-10-31 21:44
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
回复 14楼 TonyDeng
版主,这句话什么意思,
本来stu_name = malloc(),就已经把指针指向了新分配的内存,但你在后面擅自把指针的指向改变了,于是再也找不回新分配的内存的地址,此后无法释放它

head = (struct stu_power *) malloc(LEN) ,//head指向申请空间的首地址,char *stu_name怎么也指向新分配的单元了 。。糊涂了

总有人比你努力,可怕的是比你牛的人比你还努力。
2012-10-31 23:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
函数malloc()的功能,就是向操作系统在堆中申请指定LEN字节的内存,如果申请成功,就返回获得的空间的首地址给调用者,如果不成功,则返回空指针。你看malloc()的函数原型,它返回的本来是void*指针,即无类型指针,是指向任何数据类型都可以的,因为申请内存,只要空间大小即可,不管你拿这内存储存什么数据的(反正都是二进制数据),而之所以要在返回值前加强制转换,是因为C语言编译器的类型匹配机制,它需要你明确告诉编译器,把void*视为你所需要的stu_power*,因为你定义的head指针是要求指向stu_power数据类型的,赋值号两边要匹配,这仅仅是语义要求。实际上,你那个LEN的长度,能不能放得下整数个struct stu_power数据,它是不管的,那是程序员自己的事,所以用malloc()申请内存,都要把相应的数据类型转化成byte来计算,就是这个道理。

C语言允许把指针的类型强制转换掉,特别是void*向各种数据类型指针转换的大量使用,其实是很可怕的事情,因为它等于取消了强类型检查,容许程序员玩弄千变万化的数据类型变换技巧,这在众多著述中都有提及的,在C++编程规范中更是明确提出这是大忌。回看C++申请内存的语法就知道人家为什么要改成那样。

[ 本帖最后由 TonyDeng 于 2012-10-31 23:30 编辑 ]

授人以渔,不授人以鱼。
2012-10-31 23:19
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
回复 17楼 TonyDeng
对不起,版主,我比较笨

以下是引用TonyDeng在2012-10-31 21:13:47的发言:
malloc(LEN),确 实在堆中分配了12字节的内存,本来stu_name = malloc(),就已经把指针指向了新分配的内存,但你在后面擅自把指针的指向改变了,于是 再也找不回新分配的内存的地址,此后无法释放它,造成内存泄漏(在Windows中进程结束后可以替你擦屁股,但在别的系统中你这样做是找死)。使用指针 的诸多问题,正是C/C++给程序员带来无数烦恼的第一个原因,也是其他高级语言纷纷回避使用这个概念的根本原因(不是说人家从来不使用指针,而是不让程 序员直接使用指针,指针被语言内部使用)。初学者,总是被指针神话欺骗,急于接触和使用指针,结果错误频频,打击自信心,在这里不断碰钉,只能干扰语言其 他方面的学习。我历来最反感初学者为用指针而用指针编程的做法,可以说是一无是处。

stu_name = malloc()   stu_name没有指向malloc()啊。。


[ 本帖最后由 admin_xyz 于 2012-10-31 23:47 编辑 ]

总有人比你努力,可怕的是比你牛的人比你还努力。
2012-10-31 23:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你以为malloc()是一块内存?那是一个动作!malloc()就是申请一块内存,把申请得到的内存的地址作为返回值,stu_name = malloc()就是把这个返回值赋给stu_name指针记忆,如果stu_name在后来被指使指向不同的地方,那么原先malloc()得到的内存的地址就丢失了。

记住:malloc()不是地址,而只是一个动作。

授人以渔,不授人以鱼。
2012-10-31 23:48
枫中残雪
Rank: 1
等 级:新手上路
帖 子:6
专家分:6
注 册:2011-3-10
收藏
得分:1 
呵呵,L主自已把自已弄进去了吧,指针是4个字节,

[ 本帖最后由 枫中残雪 于 2012-11-1 06:19 编辑 ]
2012-11-01 04:56
快速回复:动态内存分配小问题
数据加载中...
 
   



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

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