LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1268|回复: 11

请教关于变量的内存分配问题

[复制链接]
发表于 2004-4-9 23:30:47 | 显示全部楼层 |阅读模式
下面是linux内核进程通信部分的部分源代码:
struct msg_msg {
struct list_head m_list;
long m_type;
int m_ts; /* message text size */
struct msg_msgseg* next;
/* the actual message follows immediately */
};
static struct msg_msg* load_msg(void* src, int len)
{
struct msg_msg* msg;
struct msg_msgseg** pseg;
int err;
int alen;

alen = len;
if(alen > DATALEN_MSG)
alen = DATALEN_MSG;

msg = (struct msg_msg *) kmalloc (sizeof(*msg) + alen, GFP_KERNEL);
if(msg==NULL)
return ERR_PTR(-ENOMEM);

msg->next = NULL;

if (copy_from_user(msg+1, src, alen)) {
err = -EFAULT;
}
。。。。。。
}
我不明白的是:
sizeof的参数是*msg,可是msg是一个指针变量,它还没有被分配空间,*msg传递的是什么值啊?
kmalloc分配出一块内存连续空间,msg结构体里面的各数据在这片连续空间里是怎么分布的啊?
msg的值是kmalloc分配的内存连续空间的首地址吧,msg+1也就是这片连续空间的第二个字节了,为什么要把src的内容复制到以msg+1为首地址的内存空间呢?连续空间的第一个字节里面装的又是什么呢?


会的请一定帮忙解答,谢谢先!
发表于 2004-4-10 00:41:03 | 显示全部楼层
1、指针本身是有类型的没有记错的话linux用的好像是int型
2、是连续分布的,就是一个接一个
3、不是第二个字节,而是第二个msg_msg结构体
 楼主| 发表于 2004-4-10 10:36:07 | 显示全部楼层
sizeof()的参数*msg是取msg里所存地址的内容,可是msg还没有指向任何地址啊?
msg+1不是指下一个msg_msg结构吧,还没有定义下一个啊,msg+1应该是msg的内容+1啊,也就是所得到的首地址+1,也就是连续空间的第二个字节阿,
不知道理解对不对阿?

大家帮帮我啊
发表于 2004-4-11 22:47:15 | 显示全部楼层
是否gcc在定义一个结构指针之后自动分配一个单位的空间呢???
发表于 2004-4-13 18:12:40 | 显示全部楼层
指针变量也是变量,和其他变量一样,不管指向什么类型,指针变量都是4个字节(目前来说),变量里放着所指类型的地址。
 楼主| 发表于 2004-4-13 22:23:56 | 显示全部楼层
首先谢谢回帖的同志们。

这个论坛难道就没有大虾来吗?我不知道是我的问题有问题还是怎么回事,怎么没有人帮我完整的解答呢?
发表于 2004-4-18 17:33:35 | 显示全部楼层
My opinoin:
1.sizeof(*msg)=sizeof(struct msg_msg);
   Because the parameter of the SIZEOF operator is a TYPE!
2.msg+1 means the value of msg plus 1,ex:msg=0x80000004,
then msg+1=0x80000005;
  But when the pointer is a ARRAY NAME,the result is different,ex:
  struct msg_msg msg[2];
  msg=0x80000004,then msg+1=0x80000008.
发表于 2004-4-18 18:02:21 | 显示全部楼层

回复: 请教关于变量的内存分配问题

最初由 娃哈哈 发表
下面是linux内核进程通信部分的部分源代码:
struct msg_msg {
struct list_head m_list;
long m_type;
int m_ts; /* message text size */
struct msg_msgseg* next;
/* the actual message follows immediately */
};
static struct msg_msg* load_msg(void* src, int len)
{
struct msg_msg* msg;
struct msg_msgseg** pseg;
int err;
int alen;

alen = len;
if(alen > DATALEN_MSG)
alen = DATALEN_MSG;

msg = (struct msg_msg *) kmalloc (sizeof(*msg) + alen, GFP_KERNEL);
if(msg==NULL)
return ERR_PTR(-ENOMEM);

msg->next = NULL;

if (copy_from_user(msg+1, src, alen)) {
err = -EFAULT;
}
。。。。。。
}
我不明白的是:
sizeof的参数是*msg,可是msg是一个指针变量,它还没有被分配空间,*msg传递的是什么值啊?
kmalloc分配出一块内存连续空间,msg结构体里面的各数据在这片连续空间里是怎么分布的啊?
msg的值是kmalloc分配的内存连续空间的首地址吧,msg+1也就是这片连续空间的第二个字节了,为什么要把src的内容复制到以msg+1为首地址的内存空间呢?连续空间的第一个字节里面装的又是什么呢?


会的请一定帮忙解答,谢谢先!


sizeof不是函数,只是一个运算符,这里是计算msg所指对象的大小,就是msg_msg的大小

msg+1 == (char *)msg+sizeof(struct msg_msg);
这个属于标准c的问题,书上应该有

布局:
------------------
| struct msg_msg |   msg
------------------
| actual message |   msg+1
------------------
发表于 2004-4-18 18:02:50 | 显示全部楼层

回复: 请教关于变量的内存分配问题

最初由 娃哈哈 发表
下面是linux内核进程通信部分的部分源代码:
struct msg_msg {
struct list_head m_list;
long m_type;
int m_ts; /* message text size */
struct msg_msgseg* next;
/* the actual message follows immediately */
};
static struct msg_msg* load_msg(void* src, int len)
{
struct msg_msg* msg;
struct msg_msgseg** pseg;
int err;
int alen;

alen = len;
if(alen > DATALEN_MSG)
alen = DATALEN_MSG;

msg = (struct msg_msg *) kmalloc (sizeof(*msg) + alen, GFP_KERNEL);
if(msg==NULL)
return ERR_PTR(-ENOMEM);

msg->next = NULL;

if (copy_from_user(msg+1, src, alen)) {
err = -EFAULT;
}
。。。。。。
}
我不明白的是:
sizeof的参数是*msg,可是msg是一个指针变量,它还没有被分配空间,*msg传递的是什么值啊?
kmalloc分配出一块内存连续空间,msg结构体里面的各数据在这片连续空间里是怎么分布的啊?
msg的值是kmalloc分配的内存连续空间的首地址吧,msg+1也就是这片连续空间的第二个字节了,为什么要把src的内容复制到以msg+1为首地址的内存空间呢?连续空间的第一个字节里面装的又是什么呢?


会的请一定帮忙解答,谢谢先!


sizeof不是函数,只是一个运算符,这里是计算msg所指对象的大小,就是msg_msg的大小

msg+1 == (char *)msg+sizeof(struct msg_msg);
这个属于标准c的问题,书上应该有

布局:
------------------
| struct msg_msg |   msg
------------------
| actual message |   msg+1
------------------
发表于 2004-4-18 18:04:17 | 显示全部楼层
咋发了两个涅?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表