繁体   English   中英

在LinkedList中更改数组值

[英]Change array value within LinkedList

我正在尝试制作一个程序,该程序计算给定角色在某个特定角色序列之后的概率。 为此,我使用以下实现的struct节点:

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];

我究竟做错了什么? 如何更新其价值?

您的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();

(我更喜欢第二种。)

int *prt = malloc(sizeof(int));
prt = &atual->ocorrencias;

内存泄漏,您为prt保留了空间,但是此地址在下一行被替换,此外atual->ocorrencias已经是一个指针(不要使用运算符&的地址)

改成:

int *prt = atual->ocorrencias;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM