Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Realloc的实现 intgetmin(inta,intb) { 返回一个_C_Malloc_Free_Realloc - Fatal编程技术网

Realloc的实现 intgetmin(inta,intb) { 返回一个

Realloc的实现 intgetmin(inta,intb) { 返回一个,c,malloc,free,realloc,C,Malloc,Free,Realloc,malloc不会将内存初始化为零。(calloc是等效的值。)如果您看到设置为零的情况,这是意外的 我相信库版本的realloc使用堆中不直接可用的长度信息(并且它可能高估了原始分配,这意味着在使用realloc扩展分配时可能会复制一些额外内存。这通常没有效果。) realloc在缩小分配时可能不会进行复制 另外,我应该注意到,在相同的情况下,即使realloc增加了大小,例如,如果堆中的下一个块是空闲的,也不必进行复制 malloc分配的内存被初始化为零,因此我正在检查该条件 这是不正确的。从

malloc
不会将内存初始化为零。(
calloc
是等效的值。)如果您看到设置为零的情况,这是意外的

我相信库版本的
realloc
使用堆中不直接可用的长度信息(并且它可能高估了原始分配,这意味着在使用
realloc
扩展分配时可能会复制一些额外内存。这通常没有效果。)

realloc
在缩小分配时可能不会进行复制

另外,我应该注意到,在相同的情况下,即使
realloc
增加了大小,例如,如果堆中的下一个块是空闲的,也不必进行复制

malloc分配的内存被初始化为零,因此我正在检查该条件

这是不正确的。从草稿中:

说明

2malloc函数为 大小由大小指定,其值不确定

您的
getsize
需要修复

我的重新分配功能运行良好

您甚至没有修复对齐方式——对于某些类型,对齐方式可能会失败。请阅读下面的问题

如果以前分配的内存的大小大于所需的新内存,我们还可以就地重新分配吗


就地重新分配意味着什么?这不是一个简单的禁止操作吗?

没有可移植的方法来获取malloc()分配的内存大小

然而,人们总是可以这样做来模拟你想要的东西

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;

}
#包括
#包括
#包括
void myfree(void*p){
尺寸_t*in=p;
如果(在){
--自由的;自由的;
}
}
void*mymalloc(尺寸){
大小t*result=malloc(n+sizeof(大小t));
if(result){*result=n;++result;memset(result,0,n);}
返回结果;
}
大小\u t获取大小(无效*p){
尺寸_t*in=p;
if(in){--in;return*in;}
返回-1;
}
#定义malloc(x)mymalloc(x))
#定义free(x)myfree(x))
作废*重新分配(作废*ptr,大小){
void*newptr;
int-msize;
msize=getsize(ptr);
printf(“msize=%d\n”,msize);

如果(大小我们如何修复对齐?您的总体目标是什么?您只是在重写
realloc
,还是在尝试创建一整套内存分配例程?它可能不会意外地设置为零,出于安全原因,大多数操作系统会在新分配的页面中填充零。@JustSid是的,但您不知道这是一个全新的全部已定位的页面。它可能是以前分配和释放的内存。在g++中尝试这个有趣的代码:
int*ip=new int;*ip=42;delete ip;int*ip2=new int;std::out我从来没有说过你是否获得一个新页面是决定性的。我只是认为值得一提的是,在某些情况下它并不是意外地为零。如果return类型声明为无符号
#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);
}