2013-02-12 57 views
-2

这里是我的代码分配内存,我不能使用libc的,但我不得不重新分配,并用C

char buf[1]; 
int count=0; 
while(Read(fileID, buf, 1)==1) 
{ 
     contents = (char *)realloc(contents,(iVal+1)*sizeof(char)); 
     contents[count]=buf[0]; 
     count++; 
} 

现在,我无法使用libc的,我会怎么做重新分配。问题是我不知道我正在阅读的文件的大小,所以我已经重新分配。 malloc也存在同样的问题。

+1

如果你不使用'libc'你在用什么?你的程序被编译并被链接到__________? – 2013-02-12 16:02:47

+0

为什么你不能使用“libc”?当libc不可用时,“realloc”来自何处?这是哪个平台? – Constantin 2013-02-12 16:05:08

+0

这是使用GCC的Linux X64,截至目前我正在使用LIBC,但无法再使用,因此我正在使用系统调用。鉴于这种限制,我不能使用realloc,为什么我在这里寻求帮助 – user2065365 2013-02-12 16:08:55

回答

1

如果您没有libc或其他具有内存管理功能的库(malloc/realloc/free等价物),您必须编写自己的内存管理器。 如果您正在为Linux编写内核模块,您可能有权访问kmalloc(9)kfree(9),甚至可能访问krealloc。如果没有,那么你必须编写你自己的内存管理功能。

0

lseek可以在读取任何内容之前告诉你文件的大小,所以你不需要realloc()循环。 mmap()可以将它带入内存,所以你不需要malloc()/ free()。

+0

lseek返回文件的长度?我需要给我的数组适当的大小... – user2065365 2013-02-12 16:54:24

+0

例如,如果文件有“嗨罗恩”,我需要它返回5这样我的数组可以是大小,所以我可以复制文件的内容系统调用,这是我realloc的全部目的,所以我可以动态地做到这一点,首先指定大小 – user2065365 2013-02-12 16:56:40

+0

“info lseek”报告:“成功完成后,lseek返回由 否则,将返回(off_t)-1的值,并设置errno以指示错误。“ (显然使用SEEK_END参数)。 – 2013-02-12 17:08:35