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() 分配的内存大小。
如果先前分配的内存的大小大于新的所需大小,我们是否可以进行就地重新分配?
没有可移植的方法可以获取 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=%dn", 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 %dn",getsize(aa));
strcpy(aa,"my cookie");
bb = reallocation(aa,100);
printf("bb size is %dn",getsize(bb));
printf("<%s>n",bb);
free(bb);
}
malloc
不会将内存初始化为零。 (calloc
是等效的。 如果您看到事物设置为零,那是偶然的。
我相信realloc
的库版本在堆中使用了不能直接可用的长度信息。 (它可能会高估原始分配,这意味着在使用 realloc
扩展分配时,它可能会复制一点额外的内存。 这通常没有效果。
realloc
在收缩分配时可能不会执行复制。
另外,我应该注意,在同样的情况下,即使realloc
增加大小,您也不必执行副本,例如,如果堆中的下一个块是空闲的。
Malloc 分配的内存初始化为零,所以我正在检查该条件。
这是不正确的。从草案:
描述
2 malloc 函数为对象分配空间,其大小由大小指定,其值不确定。
您的getsize
需要修复。
我的重新分配功能工作正常。
您甚至没有修复对齐方式 - 对于某些类型,它可能会失败。阅读这个SO问题。
如果先前分配的内存的大小大于新的所需大小,我们是否可以进行就地重新分配?
就地重新分配意味着什么?这不应该是一个简单的无操作吗?