|
发表于 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
------------------ |
|