| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1509 人关注过本帖
标题:动态内存分配小问题
只看楼主 加入收藏
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
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:2 
以下是引用admin_xyz在2012-11-1 19:01:07的发言:

版主的意思是 如果要输入姓名,就必须重新为char *stu_name分配一块内存。?
#include  
#include  
 
#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:31
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
zhangqi_gsts
Rank: 6Rank: 6
来 自:甘肃天水
等 级:侠之大者
威 望:1
帖 子:227
专家分:457
注 册:2011-3-27
收藏
得分:2 
回复 10楼 admin_xyz
sizeof(head->stu_name) = 4,因为stu_name是一个指针,就算你不maloc它也是4个字节,指针和数组的区别就在这儿体现了,
windows编程中有很多函数需要传入一个数组,系统函数对这个数组进行填充赋值,所以在传参数的时候不仅要数组名,而且还要你定义的数组的大小,因为你传入的数组会退化成指针,对一个指针sizeof,它永远是4

指针和数组,真的不是一回事
2012-11-02 07:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:15 
当然要再申请内存了。你的stu_power是一个占12字节的结构类型数据,相当于一个12字节的int这样的东西,定义stu_power x,就相当于int x。你的head,只是一个应该指向stu_power数据类型的指针,通过malloc(12)申请了一块12字节的内存,本意是要在这块内存储存一个具体的stu_power型数据,让head指针指向它,通过解引用*head获得这块内存的内容。

在这块内存中,又有一个命名为stu_name的指针,它被定义为指向某个字符串,但这个字符串不是在这块12字节内存中的,是在另外的地方的,要这个指针的指向有意义,你必须自己另外找块内存储存那个字符串,比如你使用了一个静态只读区的字符串"xyz",让stu_name指向了这块地址,就能解引用*stu_name得到"xyz"。也可以重新申请一块堆内存,让stu_name指向它。

在你21楼的程序中,应该先释放stu_name的内存,然后才能释放head,如果顺序颠倒了,head指针已失效,无法通过此指针寻获head->stu_name,也就无法再释放stu_name。先释放stu_name指向的堆内存,剩下只是stu_name这个失效指针占在12字节的内存中,再释放head,就把这个指针也抹掉,最后令head指针为零,确保不让后面的代码再使用head。

授人以渔,不授人以鱼。
2012-11-02 12:49
tshag
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-10-10
收藏
得分:0 
学习,不过看不懂,数据结构还没有学到家,希望大家以后多多指教,在这里先谢过了
2012-11-02 17:51
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
回复 25楼 TonyDeng
版主的解释真详细,先说声谢谢。
   
   在问版主个问题,如果只释放head的话,那stu_name所指向的字符串会不会被别的数据覆盖呢?

总有人比你努力,可怕的是比你牛的人比你还努力。
2012-11-03 19:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不会,只要你不宣布释放,操作系统会一直为它的申请者保留,不会挪作他用,所以这造成泄漏(Windows会在你的程序结束后收回这些泄漏的内存,但别的操作系统未必会)。

授人以渔,不授人以鱼。
2012-11-03 19:20
快速回复:动态内存分配小问题
数据加载中...
 
   



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

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