我试图制作一个程序来计算给定字符的概率在一定数量的字符之后。为此,我使用结构节点,如下所示:
typedef struct node
{
struct node* prox[nchars];
int* ocorrencias;
int n;
} node;
n表示特定节点的次数。指针" ocorrencias"实际上是一个具有nchars大小的数组,每个条目表示给定的字符在当前节点之后出现的次数。要初始化每个节点,我使用以下函数:
void AlocaNode(node* qualquer){
//Função usada para inicializar as variaveis de um node
qualquer = malloc(sizeof(node));
qualquer->n = 0;
qualquer->ocorrencias = (int *)calloc(nchars, sizeof(int));
}
我的问题是当我尝试更改节点的值时。我必须尝试过几十种不同的算法来更新ocorrencias数组。我试过的最后一个是下面写的。 pos是一个整数,我确信它有一个有效的值。
//Pegamos a posição do caracter no array
pos = retornaPos(letra);
//Atualizamos a ocorrencias no node
int *prt = malloc(sizeof(int));
prt = &atual->ocorrencias;
*(prt+pos) = *(prt+pos) + 1;
//E o número de vezes que o node apareceu
atual->n++;
//Verificamos se o node atual já foi alocado
if (atual->prox[pos] == NULL){
AlocaNode(atual->prox[pos]);
}
//E atualizamos o nosso node para apontar para o próximo
atual = atual->prox[pos];
我做错了什么?我如何更新其价值?
答案 0 :(得分:2)
你的AlocaNode
丢失了分配的内存,因为在函数退出后变量qualquer
超出了范围:
void AlocaNode(node* qualquer) {
qualquer = malloc(sizeof(node));
qualquer->n = 0;
qualquer->ocorrencias = (int *)calloc(nchars, sizeof(int));
}
来自调用函数的节点未更新。相反,您可以将双指针传递给node:
void AlocaNode(node **qualquer) {
*qualquer = malloc(sizeof(node));
(*qualquer)->n = 0;
(*qualquer)->ocorrencias = calloc(nchars, sizeof(int));
}
并且这样打电话:
node qualquer;
AlocaNode(&qualquer);
另一种可能性是从函数返回新节点:
node *AlocaNode(void) {
node *qualquer = malloc(sizeof(node));
(*qualquer)->n = 0;
(*qualquer)->ocorrencias = calloc(nchars, sizeof(int));
return qualquer;
}
并且这样打电话:
node qualquer = AlocaNode();
(我更喜欢第二种变体。)
答案 1 :(得分:1)
int *prt = malloc(sizeof(int));
prt = &atual->ocorrencias;
内存泄漏,您为prt
保留空间,但此地址已在下一行替换,此外atual->ocorrencias
已经是指针(不要使用地址操作符&
)
更改为:
int *prt = atual->ocorrencias;