LinuxSir.cn,穿越时空的Linuxsir!

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

这两行代码什么意思啊(新手)

[复制链接]
发表于 2007-4-20 20:10:51 | 显示全部楼层 |阅读模式
struct msg_queue *msg;
msg=(struct msg_queue *) kmalloc(sizeof(*msq),GFP_KERNEL);
我想问的是
msg本来就是一个msg_queue的指针。为什么还要给它分配空间呢?而且又要加上类型转换?
到底为了什么?
发表于 2007-4-21 13:47:15 | 显示全部楼层
Post by seskissinger
struct msg_queue *msg;
msg=(struct msg_queue *) kmalloc(sizeof(*msq),GFP_KERNEL);
我想问的是
msg本来就是一个msg_queue的指针。为什么还要给它分配空间呢?而且又要加上类型转换?
到底为了什么?
为了系统分配的更稳定性, 而且还要给这个变量一定的操作方式, 这个由后面的GFP_KERNEL来确定. 一般定义了都要进行分配的, 这个不是简单的int char这些的数据结构.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-21 13:54:54 | 显示全部楼层
Post by scutan
为了系统分配的更稳定性, 而且还要给这个变量一定的操作方式, 这个由后面的GFP_KERNEL来确定. 一般定义了都要进行分配的, 这个不是简单的int char这些的数据结构.

给这个变量一定的操作方式是什么意思呢?是不是指初始化之后。它已经指向一个数据结构。并且可以根据这个指针进行操作吗?
回复 支持 反对

使用道具 举报

发表于 2007-4-21 14:23:22 | 显示全部楼层
Post by seskissinger
给这个变量一定的操作方式是什么意思呢?是不是指初始化之后。它已经指向一个数据结构。并且可以根据这个指针进行操作吗?
此时还没有指向数据结构, GFP_KERNEL 是一个分配内存的操作方式, 还有其它的方式, 有的是不允许睡眠的这些限制条件. 不过对于这种分配方式, 建议楼主先看一下C语言中的讲解. 其实和C语言中的是一样的!
回复 支持 反对

使用道具 举报

发表于 2007-4-22 03:22:29 | 显示全部楼层
楼主应该先把C学好,然后学学系统编程,看看apue
这是基本知识,不是内核特有的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-22 14:35:40 | 显示全部楼层
多谢大家。我现在都在开始慢慢学。
msg=(struct msg_queue *) kmalloc(sizeof(*msq),GFP_KERNEL);

的意思是分配一个sizeof(*msq)大小的内存给msg 吧。
那前边的定义部分。struct msg_queue *msg
没有给msg分配内存吗?
回复 支持 反对

使用道具 举报

发表于 2007-4-22 15:36:11 | 显示全部楼层
Post by seskissinger
多谢大家。我现在都在开始慢慢学。
msg=(struct msg_queue *) kmalloc(sizeof(*msq),GFP_KERNEL);

的意思是分配一个sizeof(*msq)大小的内存给msg 吧。
那前边的定义部分。struct msg_queue *msg
没有给msg分配内存吗?
分是分配了, 但是这种方式一般不太好, 之后再采用kmalloc()要更安全可靠一些
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-22 16:43:04 | 显示全部楼层
Post by scutan
分是分配了, 但是这种方式一般不太好, 之后再采用kmalloc()要更安全可靠一些

那开始分配的内存不就泄露了?
回复 支持 反对

使用道具 举报

发表于 2007-4-22 17:25:02 | 显示全部楼层
Post by scutan
分是分配了, 但是这种方式一般不太好, 之后再采用kmalloc()要更安全可靠一些

非也!非也!
回复 支持 反对

使用道具 举报

发表于 2007-4-22 21:25:09 | 显示全部楼层
Post by seskissinger
struct msg_queue *msg;
msg=(struct msg_queue *) kmalloc(sizeof(*msq),GFP_KERNEL);
我想问的是
msg本来就是一个msg_queue的指针。为什么还要给它分配空间呢?而且又要加上类型转换?
到底为了什么?


msg=(struct msg_queue *) kmalloc(sizeof(*msq),GFP_KERNEL);
实际上就是
msg=kmalloc(sizeof(struct msg_queue),GFP_KERNEL);
目的是动态分配内存。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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