| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1509 人关注过本帖
标题:动态内存分配小问题
取消只看楼主 加入收藏
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
结帖率:97.3%
收藏
已结贴  问题点数:20 回复次数:8 
动态内存分配小问题
程序代码:
#include <stdio.h>
#include <stdlib.h>

#define  LEN   sizeof(struct stu_power)

struct  stu_power
    {
        char                *stu_name;
        unsigned int        power;
        struct stu_power    *next;
    };

int main ()
{
    struct  stu_power   *head;      //head存放 stu_power的首地址

    head = (struct stu_power *) malloc(LEN);

    head->stu_name = "xyz";                           //malloc(LEN) 是12字节,malloc申请的内存是固定的呀, stu_name是一个字符指针啊,在未指向存储空间的时候怎么能赋值呢。
                                                                       //那为什么head->stu_name还可以输入任意长度的字符串啊
    head->power    = 999;

    printf ("%s --> %d\n", head->stu_name, head->power);

    return 0;
}



[ 本帖最后由 admin_xyz 于 2012-10-30 22:25 编辑 ]
搜索更多相关主题的帖子: 内存 动态 power 
2012-10-30 22:11
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
看了大牛们的解释,懂了。总结一下,

 head = malloc(LEN) //   为char *stu_name 申请的空间只是4个字节。



总有人比你努力,可怕的是比你牛的人比你还努力。
2012-10-31 20:02
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
回复 9楼 TonyDeng
sizeof(head->stu_name) = 4呀,所以我说为char *stu_name分配4个字节。

总有人比你努力,可怕的是比你牛的人比你还努力。
2012-10-31 20:21
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
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
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
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
回复 19楼 TonyDeng
版主的意思是 如果要输入姓名,就必须重新为char *stu_name分配一块内存。?
程序代码:
#include <stdio.h>
#include <stdlib.h>

#define  LEN   sizeof(struct stu_power)

struct  stu_power
{
    char                *stu_name;
    unsigned int        power;
};

int main ()
{
    struct  stu_power   *head;      //head存放 stu_power的首地址

    head = (struct stu_power *) malloc(LEN);

    head->stu_name = (char *) malloc(50);     //为char *stu_name 分配一块内存

    scanf ("%s %d", head->stu_name, &head->power);

    printf ("%s --> %d\n", head->stu_name, head->power);

    free(head);

    return 0;
}


总有人比你努力,可怕的是比你牛的人比你还努力。
2012-11-01 19:01
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
回复 22楼 zklhp
释放free(head) //head指向的内存空间释放掉,(包括char *stu_name) 所以    head->stu_name = (char *) malloc(50);//申请的50字节的空间也就没有指针去指向它了,z版,对么

总有人比你努力,可怕的是比你牛的人比你还努力。
2012-11-01 20:47
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
回复 25楼 TonyDeng
版主的解释真详细,先说声谢谢。
   
   在问版主个问题,如果只释放head的话,那stu_name所指向的字符串会不会被别的数据覆盖呢?

总有人比你努力,可怕的是比你牛的人比你还努力。
2012-11-03 19:16
快速回复:动态内存分配小问题
数据加载中...
 
   



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

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