【问题标题】:Cant access data after realloc struct vector重新分配结构向量后无法访问数据
【发布时间】:2015-03-20 00:00:31
【问题描述】:

我正在使用realloc来减小我的向量的大小。我只想松开最后一个位置。所以,如果我有 10 个位置并且我使用realloc9 * 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 按预期工作(尽管它并没有真正改变我认为合乎逻辑的缓冲区地址)。
  • bufferstruc 指向同一个内存区域(记住,你刚刚创建了struc = buffer)你可以释放它们中的任何一个。

标签: c vector struct realloc


【解决方案1】:

realloc() 可以移动您的数据。所以如果有任何指向数据的指针,在调用之后,这些指针就会失效。

【讨论】:

  • 所以在realloc 之后我无法访问:my_struct[0].Name 是否已经有数据了?有解决方案吗?我必须调用一个函数来再次填充它吗?
  • @PlayHardGoPro 你的意思是struc[0].Name?是的,您可以访问它。你不能做的是my_struct *ptr = &struc[0]; ,然后是你的realloc代码,然后访问ptr->Name
  • 收到错误。谢谢你,先生!我写对了,但是我在 realloc 中使用了错误的参数。 ;s
猜你喜欢
  • 2014-12-09
  • 2016-07-20
  • 2019-10-08
  • 2018-04-04
  • 2018-01-07
  • 2010-11-13
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
相关资源
最近更新 更多