有人告诉我,即使它是安全的,但绝对是不正确的做法。我的问题是,这样做实际上安全吗,还是彻头彻尾的不确定行为?假设我分配了一个100字节的内存块,但我想将其缩小到50。将50加到指针并释放它是否安全?这是代码示例:
char *ptr = malloc(100);
//...
free(ptr+50);
//Presumably, since I freed the second half only, would that be equivalent to ptr = realloc(ptr, 50);?
这是跨平台/未定义的行为吗?使用这种缩小内存的方法安全吗?
您只能将从free
,malloc
,realloc
返回的指针传递给calloc
。传递其他任何内容都是undefined behavior。
关于C standard功能状态的free
的第7.23.2.3p2节:
free
函数使ptr
指向的空格为 释放,即可供进一步分配。如果ptr
是空指针,不执行任何操作。 否则,如果 参数与先前由a返回的指针不匹配 内存管理功能,或者如果空间已被占用 通过调用free
或realloc
释放,行为是 未定义。
这里要做的正确的事情是分配一个新的内存块,使用memcpy
复制字节,并使用free
旧块。