Nano Hash - криптовалюты, майнинг, программирование

изменение содержимого структуры/переменной в C

Хотелось бы получить помощь в следующем вопросе. У меня есть структура Node, и я хочу изменить ее внутренности, используя какой-то метод. и я хочу распечатать содержимое измененной структуры внутри моего основного метода. как мне изменить структуру и увидеть измененное значение в моей основной, не возвращая узел в качестве возвращаемого значения. Я думаю, это можно решить, передав struct Node в качестве указателя, а затем отредактировав его. как правильно это сделать?

Например:

typedef struct Node{
   struct Node * right;
   struct Node * left;
   void * data;
}Node;

void insert(void * element, Node* root){
   if(root==NULL){
       root=(Node*)malloc(sizeof(Node));
       root->data=element;
   }
}


int main(){
    Node a;
    int b=8;
    insert(&b,&a);
    printf("%d",*(int*)a.data);
    return 0;   
}

printf печатает не 8, а 1 (думаю, какой-то мусор)


  • Если это домашнее задание, пожалуйста, отметьте его как таковое. И да, указатели — это то, что нужно для этого. 07.02.2012

Ответы:


1

Похоже, вы пытаетесь сделать следующее

  • Создайте структуру в одном методе, скажем, main
  • Передайте его второму методу, скажем, например
  • Пусть пример изменит структуру и отобразит результаты в основном

Если это так, то в C это можно сделать, передав struct в качестве указателя на example.

struct Node {
  int data;
  struct Node* pNext;
};

void example(struct Node* pNode) {
  pNode->data = 42;
  pNode->pNext = NULL;
}

int main() {
  struct Node n;
  example(&n);
  printf("%d\n", n.data);
}

ИЗМЕНИТЬ

Отвечая на обновленный вопрос.

Чтобы увидеть результат модификации Node, вы должны передать Node*. И соответственно чтобы увидеть результат модификации Node* нужно пройти Node**. По сути, вам нужно пройти еще один уровень косвенности, чем значение, которое вы хотите изменить/вернуть.

void insert(void* element, Node** ppRoot){
  if (NULL == *ppRoot) {
    Node* pTemp = malloc(sizeof(Node));
    pTemp->data = element;
    *ppRoot = pTemp;
  }
}
07.02.2012
  • когда я делаю, как вы говорите, все получается правильно, но что, если я хочу выделить память с помощью malloc, как я это сделал. почему тогда не работает? 07.02.2012
  • @mary причина, по которой все в C передается по значению. По сути, в функцию передается копия локального. Таким образом, с помощью одного указателя вы просто выделяете память для копии, которая не видна из main. С двойным указателем вы передаете копию двойного указателя, но он по-прежнему указывает на тот же указатель, что и значение в main. Поэтому, когда вы меняете указанное значение, оно видно обоим методам. 07.02.2012
  • У меня есть еще один вопрос. если я использую if(root==NULL) , единственный способ изменить тот факт, что root имеет значение null, - это выделить для него некоторую память? 07.02.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..