你好。 我有一个关于最长公共子序列的项目
molecular hydrogen
对于小矩阵,它工作正常,但对于更大的序列,我得到堆栈溢出。 我被告知"你不应该在main()函数或任何其他函数中存储2D矩阵(它可能导致堆栈溢出)。可能将其移出函数或动态分配。"但是我不知道这个人在功能之外移动它意味着什么,我不知道分配2D矩阵。
对不起,很长的帖子。 谢谢
答案 0 :(得分:1)
替换
char X[m], Y[n];
通过
char *X = malloc(m * sizeof(char));
char *Y = malloc(n * sizeof(char));
并在main
添加结尾处
free(X);
free(Y);
现在您在堆上进行动态分配。你所做的不是标准的(堆栈上的可变长度数组,见here)。除此之外,我还没有检查你的代码。乍一看,在计算时首先分成n
和m
似乎很奇怪,然后在填充时使用i
两个数组。
<强>更新强>:
现在我看到你在原帖中编辑了你的代码。以下是使用双指针的方法。
分配:
int **L = malloc((m + 1) * sizeof(int*));
for (int i = 0; i < m + 1; i++)
L[i] = malloc((n + 1) * sizeof(int));
释放:
for (int i = 0; i < m + 1; i++)
free(L[i]);
free(L);
然后移除realloc
。并且不要忘记在释放后你不能返回L[m][n]
,所以存储该值,然后释放,然后返回值。