| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2450 人关注过本帖
标题:[讨论]关于malloc的用法
只看楼主 加入收藏
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
 问题点数:0 回复次数:9 
[讨论]关于malloc的用法
已有如下结点定义

#define NULL 0 /*宏定义*/
typedef struct node /*定义结点类型的数据结构*/
{
char c; /*数据域,类型为字符型*/
struct node *next; /*指针域,类型为本结构体类型*/
}*L; /*类型重定义,即Node和*L和struct node等价*/


main()
{
L l,p,q; /*用指针类型定义三个结点类型的指针*/
char ch;
int n;
l=(L)malloc(sizeof(struct node)); //已知此句与l=(L)malloc(sizeof(L))不等价
…………
}

然而使用l=(L)malloc(sizeof(L)),程序运行正常,但显然sizeof(L)和sizeof(struct node)大小不一,请问用l=(L)malloc(sizeof(L))这句为什么程序运行也正常?是不是用L定义的指针只需要sizeof(L)即可?如果是这样,那么我用l=(L)malloc(sizeof(struct node))这句,多出来的空间到哪去了?

本人确实还不太明白,请指教!
搜索更多相关主题的帖子: malloc 用法 node 定义 类型 
2007-10-28 08:44
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

sizeof()求出的只是一个数.
当然sizeof(node *)合法,只是得出的结果和sizeof(node)不一样.
所以是逻辑错误.
这一点可以直接用个简单例子说明:
#include<stdio.h>
int main()
{

printf("char--->%d %d\n",sizeof(char),sizeof(char *));
printf("int--->%d %d\n",sizeof(int),sizeof(int *));
printf("double--->%d %d\n",sizeof(double),sizeof(double *));
return 0;
}

/*C-FREE编译运行结果如下:*/
/*
char--->1 4
int--->4 4
double--->8 4
Press any key to continue...
*/
可以看到,指针的大小是一个定值,即一个地址所占的字节数,而不同的类型所占的字节数是不同的,所以一般情况下,这两个值是不相等的.


倚天照海花无数,流水高山心自知。
2007-10-28 09:47
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
结构体算所占空间大小的时候会出现内存对齐的情况.
如果出现连续若干个char型,会自动组合为若干个地址字节数(不超过的部分为1个单位)
其它的都会向各数据类型中所占字节数最多的靠齐.
举个例子
#include<stdio.h>
typedef struct node{
char info[3];//把3换成5,再试
node *next;
char data;
};
int main()
{
printf("node--->%d %d\n",sizeof(node),sizeof(node *));
return 0;
}
/*node--->12 4*/

#include<stdio.h>
typedef struct node{
char info[3];
char data;
node *next;
};
int main()
{
printf("node--->%d %d\n",sizeof(node),sizeof(node *));
return 0;
}
/*node--->8 4*/




倚天照海花无数,流水高山心自知。
2007-10-28 10:10
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
具体的请baidu查内存对齐吧.
我想我自己可能说不清楚.

倚天照海花无数,流水高山心自知。
2007-10-28 10:28
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
你说的内存对齐我明白,我不明白的是,就如你定义的结点,即然结点需要的空间是8(或者12),怎么我的程序中用L(实验证明大小是4)也可以运行正常?用指针的话不是应该空间不足了吗?

[此贴子已经被作者于2007-10-28 10:56:31编辑过]


努力成为菜鸟!
2007-10-28 10:54
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
L是指针,大小是4.

倚天照海花无数,流水高山心自知。
2007-10-28 10:59
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
c对指针越界没有限制,你用sizeof(L)申请了4个字节的内存,等会赋值的时候发现放不下,会继续往后面放

从BFS(Breadth First Study)到DFS(Depth First Study)
2007-10-28 11:25
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 

我改了一下你的程序


#include<stdio.h>
#include <stdlib.h>
#define NULL 0 /*宏定义*/
typedef struct node /*定义结点类型的数据结构*/
{
char c; /*数据域,类型为字符型*/
struct node *next; /*指针域,类型为本结构体类型*/
}*L; /*类型重定义,即Node和*L和struct node等价*/


int main()
{
L l; /*用指针类型定义三个结点类型的指针*/
l=(L)malloc(sizeof(struct node)); //已知此句与l=(L)malloc(sizeof(L))不等价
printf(\"%x\t%x\t%x\n\",l,&(l->c),&(l->next));
free(l);
l=(L)malloc(sizeof(L)); //已知此句与l=(L)malloc(sizeof(L))不等价
printf(\"%x\t%x\t%x\n\",l,&(l->c),&(l->next));
free(l);
return 0;
}


VC6运行结果:

431de0 431de0 431de4
430030 430030 430034
Press any key to continue

注意看第二行,用malloc只申请了4个字节的内存,应该是从430030~430033,但是l->next却是放在了430034,这就是越界


从BFS(Breadth First Study)到DFS(Depth First Study)
2007-10-28 11:36
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
明白了,原来如此,难怪一直没发现。谢谢了!

努力成为菜鸟!
2007-10-28 12:03
柒兲
Rank: 1
等 级:新手上路
威 望:1
帖 子:126
专家分:0
注 册:2007-9-26
收藏
得分:0 

2007-10-28 20:20
快速回复:[讨论]关于malloc的用法
数据加载中...
 
   



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

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