【问题标题】:C - realloc error when changing member in structC - 更改结构中的成员时出现重新分配错误
【发布时间】:2016-08-03 14:17:02
【问题描述】:

尝试更改结构中的 int 成员时出现此错误:

`./resize' 中的错误:realloc():下一个大小无效:0x00000000006bc010 *** 中止(核心转储)

我的代码是:

#include <stdlib.h>

typedef struct {
    char* name;
    int size;
} fich;

int main(){

    int i = 1;
    fich * ptr = NULL;

    while(i < 5){
         fich* newptr = realloc(ptr, i * sizeof(fich));
         if(newptr != NULL)
             ptr = newptr;
         else return 1;

         ptr[i].name = "stufs";
         ptr[i].size = 1;

         i++;
    }

return 0;
}

我可以更改名称,但不能更改大小。怎么回事?

【问题讨论】:

  • 您分配的数组有i 条目。这意味着ptr[i] 超出范围。在有效范围之后仅写入一项可能会破坏系统分配的内部数据。从i = 0 开始分配i + 1 项。 (更好的是,一次分配所有五个项目。)
  • @MOehm 天哪,我太笨了。谢谢!!但是为什么更改char *时没有错误?
  • 无需自责,很多错误事后看来很愚蠢。至于你的问题:你不知道到底发生了什么,这是未定义的行为。 (这也是你应该学会在代码中发现这种未定义行为的原因。)
  • @MOehm 嗯,我明白了。再次感谢:)

标签: c struct realloc


【解决方案1】:

在 C 中,数组从索引 0 开始。使用 i=1 的第一次迭代会为一个 fich 分配空间,即 ptr[0],而不是 ptr[1]

经典的一对一结合缓冲区溢出:-)

【讨论】:

  • 是的,就是这样,就像 MOehm 在 cmets 中所说的那样。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
相关资源
最近更新 更多