早上好
在编写代码之前,我不希望你们给我代码供我使用,因为我不知道为什么会那样做。我想学习为什么这段代码会失败,以及如何正确使用内存分配,以免将来再次失败。
我遇到的问题与代码中的一个函数有关,该函数的目标是给定2D动态字符数组(Matrix)和另一个动态单词数组(List),以查找Matrix上的所有路径。列表中的单词驻留,然后将这些路径存储在另一个动态数组(路径)中。我的问题不在于如何找到这些路径,而在于如何存储它们,因为我在解决方案上的所有尝试都遇到了内存重新分配错误。
这是有问题的功能
注释:
此代码找到一条路径,将其存储到temp中,然后应该分配内存以将temp复制到path中,然后重复执行。没有代码的分配部分,并且只有几个printfs,代码确实可以正确显示所有路径。但是显示和存储是两件事
int ** path - the dyn array for the paths
int ** num_caminhos - the number of paths
char * palavra - the word to currently search for
int ID - the ID of the word, for later reference
void pesquisa(int ** path, int *num_caminhos, char **matriz, int num_colunas, int num_linhas, char * palavra, int l, int c, int li, int ci, int * temp, int d, int ID){
if (matriz[l][c]==palavra[d]){
if ((l-1)>=0 && palavra[d+1]==matriz[l-1][c]){
temp[5+d]=1;
pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l-1, c, li, ci, temp, d+1, ID);}
if ((l-1)>=0 && (c+1)<num_colunas && palavra[d+1]==matriz[l-1][c+1]){
temp[5+d]=2;
pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l-1, c+1, li, ci, temp, d+1, ID);}
if (((c+1)<num_colunas) && (palavra[d+1]==matriz[l][c+1])){
temp[5+d]=3;
pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l, c+1, li, ci, temp, d+1, ID);}
if ((l+1)<num_linhas && (c+1)<num_colunas && palavra[d+1]==matriz[l+1][c+1]){
temp[5+d]=4;
pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l+1, c+1, li, ci, temp, d+1, ID);}
if ((l+1)<num_linhas && palavra[d+1]==matriz[l+1][c]){
temp[5+d]=5;
pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l+1, c, li, ci, temp, d+1, ID);}
if ((l+1)<num_linhas && (c-1)>=0 && palavra[d+1]==matriz[l+1][c-1]){
temp[5+d]=6;
pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l+1, c-1, li, ci, temp, d+1, ID);}
if ((c-1)>=0 && palavra[d+1]==matriz[l][c-1]){
temp[5+d]=7;
pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l, c-1, li, ci, temp, d+1, ID);}
if ((l-1)>=0 && (c-1)>=0 && palavra[d+1]==matriz[l-1][c-1]){
temp[5+d]=8;
pesquisa(path, num_caminhos, matriz,num_colunas, num_linhas, palavra, l-1, c-1, li, ci, temp, d+1, ID);}
}
if ((d==strlen(palavra)-1) && (palavra[0]==matriz[li][ci])){
path=realloc(path, ((*num_caminhos)+1)*sizeof(int *));
path[*num_caminhos]=malloc((strlen(palavra)+5)*sizeof(int));
temp[0]=ID;
temp[1]=li;
temp[2]=ci;
temp[3]=l;
temp[4]=c;
for (int i=0; i<5+d; i++){
path[*num_caminhos][i]=temp[i];
}
*num_caminhos=*num_caminhos+1;
return;
}
}
很抱歉,如果代码显示太多“业余”错误:P。随着我了解更多,我倾向于纠正它们。只是最后一个细节,我被迫使用dyn内存分配作为此代码目标的一部分。