【发布时间】:2015-03-20 00:00:31
【问题描述】:
我正在使用realloc来减小我的向量的大小。我只想松开最后一个位置。所以,如果我有 10 个位置并且我使用realloc 为9 * sizeof(my_struct) 分配足够的空间,向量会被截断并保留旧数据但最后一个位置吗?我认为这是对的,但是当我尝试在 realloc 之后打印该值时,我得到 Segmentation Fault 错误。这是我的代码:
//Instanciate the vector
my_struct *struc;
my_struct *buffer;
//Allocate space for 10 slots
struc = (my_struct *) malloc(10 * sizeof(my_struct));
//realloc for 9 slots
buffer = (my_struct *) realloc(struc, 9 * sizeof(my_struct));
if(buffer != NULL){
struc = buffer;
}
现在如果我尝试使用printf 检查向量内的元素,我会得到Segmentaition Fault
OBS:向量在重新分配之前已被数据填充。我没有在这里发帖,因为我认为这是不必要的......想象一下这个代码中已经包含数据的向量。
【问题讨论】:
-
您发布的代码看起来不错。由于您的程序中的另一个错误,可能已经存在堆损坏。为了获得更好的帮助,follow the instructions to create a MCVE
-
@MattMcNabb 谢谢。我的想法呢,对吗?如果我从 10 个位置重新分配到 9 个位置,我只会失去最后一个位置吗?剩下的数据会ok分配吗?
-
是的,它就是这样工作的。
-
确实!我刚刚用一个只有一个整数字段的简单结构对其进行了测试,
realloc按预期工作(尽管它并没有真正改变我认为合乎逻辑的缓冲区地址)。 -
当
buffer和struc指向同一个内存区域(记住,你刚刚创建了struc = buffer)你可以释放它们中的任何一个。