int getmin(int a, int b)
{
return a<b?a:b;
}
void *reallocation(void *ptr, size_t size) //size_t in bytes
{
void *newptr;
int msize;
msize = getsize(ptr);
msize = getmin(msize, size);
printf("msize = %d", msize);
newptr = malloc(size);
newptr = memcpy(newptr, ptr, msize);
free(ptr);
return newptr;
}
我已经实现了自己的realloc,并且为了使用malloc来获取已分配内存的大小(但是我知道c中没有任何方法)。
我的重新分配功能在我的系统上正常运行 我们如何获得malloc()分配的内存大小。
如果以前分配的内存大小大于新的内存,我们也可以进行内部重新分配吗?
答案 0 :(得分:11)
没有可移植的方法来获取malloc()分配的内存大小。
然而,人们可以总是这样做来模拟你想要的东西。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void myfree(void * p) {
size_t * in = p;
if (in) {
--in; free(in);
}
}
void * mymalloc(size_t n) {
size_t * result = malloc(n + sizeof(size_t));
if (result) { *result = n; ++result; memset(result,0,n); }
return result;
}
size_t getsize(void * p) {
size_t * in = p;
if (in) { --in; return *in; }
return -1;
}
#define malloc(_x) mymalloc((_x))
#define free(_x) myfree((_x))
void *reallocation(void *ptr,size_t size) {
void *newptr;
int msize;
msize = getsize(ptr);
printf("msize=%d\n", msize);
if (size <= msize)
return ptr;
newptr = malloc(size);
memcpy(newptr, ptr, msize);
free(ptr);
return newptr;
}
int main() {
char * aa = malloc(50);
char * bb ;
printf("aa size is %d\n",getsize(aa));
strcpy(aa,"my cookie");
bb = reallocation(aa,100);
printf("bb size is %d\n",getsize(bb));
printf("<%s>\n",bb);
free(bb);
}
答案 1 :(得分:3)
malloc
不会将内存初始化为零。 (calloc
与之相同。)如果你看到的东西设置为零,那就是偶然的。
我相信realloc
的库版本使用堆中不可直接使用的长度信息。 (它可能会高估原始分配,这意味着在使用realloc
扩展分配时可能会复制一些额外的内存。这通常没有效果。)
realloc
可能无法复制。
另外,我应该注意,在相同的情况下,即使realloc
增加了大小,也不必进行复制,例如,如果堆中的下一个块是空闲的。
答案 2 :(得分:1)
malloc分配的内存被初始化为零,所以我正在检查那个条件。
这是不正确的。从草案:
说明
2 malloc函数为其对象分配空间 size由size指定,其值是不确定的。
您的getsize
需要修复。
我的重新分配功能正常。
您甚至没有修复对齐 - 某些类型可能会失败。阅读this SO问题。
如果以前分配的内存大小大于新的内存,我们也可以进行内部重新分配吗?
就地重新分配意味着什么?这不应该是一个简单的无操作吗?