【问题标题】:callin' c from lua crashs while reallocating从 lua 调用'c 在分配时崩溃
【发布时间】:2026-02-05 14:15:01
【问题描述】:

我在那个 for 循环中遇到了一个疯狂的错误

matr=realloc(matr, newmax*sizeof(matr*));

for (i=0; i<newmax; i++){
    matr[i]=realloc(matr[i], newmax*sizeof(int));
}

matr 是一个多维数组:int **matr。我需要调整列和行的大小。第一行调整列的大小,for 循环调整每一行的大小。它在 c 中运行良好。现在我正在为 lua 开发一个库,它在这里崩溃了。编译也可以正常工作。但是从 lua 调用会崩溃

lua: malloc.c:3552: mremap_chunk: Assertion `((size + offset) & (mp_.pagesize-1)) == 0' failed.

我不知道,因为在 c 中使用它可以正常工作。

【问题讨论】:

  • 指向'matr'的指针是否存储在lua解释器中?也许解释器在数组被重新分配后的某个地方使用了旧指针。
  • mtr 是 c 中结构的一部分。并且该结构表示为 lua 的用户数据。
  • 到达“g”键并不比到达撇号更难。只是说。

标签: c lua malloc realloc


【解决方案1】:

调用realloc后,新分配部分的内容是不确定的。这意味着在新行上调用realloc 可能会失败,因为它试图重新分配一个无效的指针。

您可以在旧行上使用realloc,在新行上使用malloc 来解决此问题。或者您可以在第一个 realloc 之后将新部分归零,然后您的循环将按原样工作:

matr=realloc(matr, newmax*sizeof(matr*));
for (i=oldmax; i<newmax; i++)
    matr[i] = NULL;

for (i=0; i<newmax; i++){
    matr[i]=realloc(matr[i], newmax*sizeof(int));
}

【讨论】:

  • “您可以将新零件归零”是什么意思?
  • 我添加了代码来展示这一点。它之所以有效,是因为 realloc 在传递空指针时的行为类似于 malloc。
  • 好的,现在看来可以了。我认为新的分段错误是由不同的东西引起的。