这是一项家庭作业,所以我不想发布任何代码,但我对我所拥有的错误感到非常难过。
目前我有一个已被malloced的数组并且正在复制指向数组的指针。现在,我可以使用这个数组进行memcpy和memmove,并且工作正常。
然而,当我对它进行realloc时会出现无效的指针错误 - 我完全不知道为什么。
有人可以帮忙吗?
答案 0 :(得分:2)
realloc()
仅在您传递的指针是先前从malloc()
,calloc()
或realloc()
(或NULL
返回的指针时才有效,在这种情况下它的工作原理与malloc()
)完全相同。
您无法在阵列上调用它。如果你有这样的struct
:
struct foo {
char a;
int x[5];
double z;
};
然后您无法使用realloc()
来增加x
的大小。您必须转而使用完全动态分配:struct成员更改为指针:
struct foo {
char a;
int *x;
double z;
};
...当您创建struct
的实例时,请拨打malloc()
进行初始分配:
struct foo f;
f.x = malloc(5 * sizeof f.x[0]);
现在,您可以在realloc()
上致电f.x
,但费用是,当不再需要该结构时,您还必须在free()
上调用f.x
。
答案 1 :(得分:1)
你说'我将指向这个数组的指针复制到另一个变量'。问题是,只要执行realloc,原始指针就不再有效。我没有看到将指针复制到变量的原因?
答案 2 :(得分:1)
当realloc
或free
导致无效指针错误或段错误时,并且您确定您正在传递从malloc
获取的有效指针,然后很可能是你损坏了你的记忆:你写了malloc
存储内存块簿记的区域。在您的情况下,这是memcpy
或memmove
来电。
您可以使用valgrind内存错误检测器来帮助您找到这类错误。