Указатели на структуры, передаваемые функции

#c #pointers #persistence #struct

#c #указатели #постоянство #структура

Вопрос:

Это урезанная версия моей программы. Мне нужно передать указатель на указатели структур на функцию, изменить структуры внутри функции и сохранить эти изменения. Объявление функции должно оставаться неизменным.

В настоящее время я могу изменять данные внутри функции, но после возврата в main никаких изменений внесено не было.

Спасибо за вашу помощь.

 int main()
{
    struct node** HuffmanNodes;
    read_Huffman_encoded_data(amp;HuffmanNodes);
}

void read_Huffman_encoded_data(**HuffmanNodes)
{
    Huffman_node = (node**)malloc(sizeof(node*)*(*number_of_nodes));

    int index;
    for(index=0; index<*number_of_nodes;index  )
    {
        Huffman_node[index] = (node*)malloc(sizeof(node));
        Huffman_node[index]->first_value=1;
        Huffman_node[index]->second_value=2;
    }
}
  

Ответ №1:

У вас проблема с вводом указателя. Я удивлен, что он даже компилируется, поскольку amp;HuffmanNodes имеет тип node*** .

Попробуйте это:

 void read_Huffman_encoded_data(struct node ***HuffmanNodes)
{
    *Huffman_nodes = (node**)malloc(sizeof(node*)*(*number_of_nodes));

    int index;
    for(index=0; index<*number_of_nodes;index  )
    {
        (*Huffman_nodes)[index] = (node*)malloc(sizeof(node));
        (*Huffman_nodes)[index]->first_value=1;
        (*Huffman_nodes)[index]->second_value=2;
    }
}
  

У вас также есть некоторые несоответствия имен (которые я исправил), я надеюсь, что это просто опечатки из-за удаления программы.

РЕДАКТИРОВАТЬ: альтернативный метод

 int main()
{
    struct node** HuffmanNodes = (node*)malloc(sizeof(node) * (*number_of_nodes));
    read_Huffman_encoded_data(HHuffmanNodes);
}

void read_Huffman_encoded_data(struct node **HuffmanNodes)
{
    int index;
    for(index=0; index<*number_of_nodes;index  )
    {
        Huffman_nodes[index] = (node*)malloc(sizeof(node));
        Huffman_nodes[index]->first_value=1;
        Huffman_nodes[index]->second_value=2;
    }
}
  

Комментарии:

1. Когда я изменил ваше предложение, цикл for изменяет значения структур при первом прохождении, но seg выдает ошибку, когда он пытается выполнить цикл снова.

2. Просто для пояснения: итак, он проходит 1 итерацию цикла for. Затем сбой на втором?

3. ДА. Кроме того, чтобы не быть придирчивым, но было бы проще, если бы объявление функции осталось прежним, с ** HuffmanNodes . Если проблема заключается в amp; при вызове функции, это можно изменить.

4. Если вы не хотите использовать *** HuffmanNodes, тогда вам нужно будет выделить его в main. Позвольте мне внести свою правку. Что касается причины сбоя в цикле, мне еще предстоит это выяснить.

5. Я не могу выделить его в main, потому что пропущенные части этой функции предназначены для чтения из файла и инициализации структур из данных файла.

Ответ №2:

Попробуйте это:

 int main()
{
    struct node** HuffmanNodes;
    read_Huffman_encoded_data(amp;HuffmanNodes);
}

void read_Huffman_encoded_data(**HuffmanNodes)
{
    Huffman_node = (node*)malloc(sizeof(node)*(number_of_nodes));

    int index;
    for(index=0; index<*number_of_nodes;index  )
    {
        Huffman_node[index] = (node*)malloc(sizeof(node));
        Huffman_node[index]->first_value=1;
        Huffman_node[index]->second_value=2;
    }
}
  

Комментарии:

1. Когда я запускал это, он по-прежнему не показывал изменений при возврате к main.