2012-05-23 35 views
1

所以我想在模块初始化时动态地分配一个缓冲区。缓冲区必须始终处于范围内,因为它存储用户空间程序与之交互的数据。因此,这里是我的代码:kmalloc:只分配4个字节

static char* file_data 
#define MAX_SIZE 256 
. 
. 
. 
{ 
    file_data = kzalloc(MAX_SIZE, GFP_KERNEL) 

. 
. 
. 
} 

然而,当我做sizeof file_data它总是返回4.我在做什么错?

编辑:缓冲区存储来自用户空间程序的输入,但4个字符都是可以存储的。

size_t read_file(char* __user buf, size_t count) 
{ 
    unsigned int len = 0; 
    len = copy_to_user(buf, file_data, count); 
    return count; 
} 

ssize_t write_file(char* __user buf, size_t count) 
{ 
    if(count >= MAX_SIZE) 
     return -EINVAL; 
    copy_from_user(file_data, buf,count) 
    return count; 
} 
+0

我想我正在学习什么“动态分配”。我的假设是编译器可以告诉我尺寸信息。我错了。谢谢你们的答案! :) – Nathan

回答

4

file_data是一个指针。在32位平台上,它的大小是32位或4个字节。你想知道的是的大小,file_data指向的数据。您不能使用sizeof运算符,因为sizeof是编译时操作。你不能在运行时动态分配的东西上使用它。

(再说,你已经知道了数据的大小指向file_data - 这是MAX_SIZE?)

3

char *file_data是指向一个char。显然你是在32位系统上,所以任何指针都是4字节。编译器(处理sizeof)不知道或在意为file_data指定的内存分配了多少内存,它只是知道您要索引指针的大小(不管您是否指向或不指定)。如果你想要它指向的内存大小,你必须自己跟踪它。

相关问题