2016-04-05 2 views
0

Я хотел бы лучше понять динамические указатели.Управление динамическим указателем C-программирование

int main(){ 

    // allocate pointer 
    randomStructure *pt = (randomStructure *)malloc(sizeof(randomStructure)); 

    // arbitrary code that manipulates data that *pt points to. 

    // function call 
    function(pt); 

    return 0; 
} 


void function(randomStructure *pt){ 

    randomStructure *tempPt = (randomStructure *)malloc(sizeof(randomStructure)); 

    // arbitrary code that manipulates data that *tempPt points to. 

    pt = tempPt; 

    //free(tempPt); Question2 

    /* Question 4 
    while(index){ 
    randomStructure *tempPt = (randomStructure *)malloc(sizeof(randomStructure)); 

    } 
    */ 

} 

Вопросы:

  1. Когда я прохожу *pt к функции, она автоматически обновит *pt в основной или мне нужно вернуться *pt из функции, чтобы сделать это?

  2. Если я освобождаю *tempPt в функции, это также бесплатно *pt?

  3. Если функция malloc a *tempPt внутри функции, будут ли данные, которые она указывает на автоматическую освобождение после завершения функции?

  4. Этот вопрос можно ответить косвенно из предыдущих вопросов, но как бы я создать *tempPt и DEALLOCATE в цикле без deallocating *pt так, что этот процесс может повторяться?

EDIT Вопрос 4: Возможно, более конкретный пример того, что я пытаюсь сделать, прояснит вопрос. Я запускаю базовый алгоритм эвристики. После того, как я передаю указатель на функцию, я манипулирую данными, а затем запускаю алгоритм и указываю на него с помощью * tempPt. Если данные * tempPt более оптимизированы, чем * pt, я хочу обновить * pt с данными * tempPt.

+1

Что такое «Динамический указатель»? –

+1

Добро пожаловать в переполнение стека. Пожалуйста, не используйте дознания или подписи. SO не является дискуссионным списком, это скорее онлайн-справочник по проблемам программирования. Совместимость и ясность очень важны, и наоборот, пух нежелателен. Пожалуйста, прочитайте «[ask]» для получения дополнительной информации. –

+1

Gotcha мой плохой. Это мой первый пост. Все советы приветствуются! Я не совсем уверен, как бы я назвал указатель, указывающий на динамически выделенную память, поэтому я просто назвал ее «Динамический указатель». Возможно, мой примерный код прольет на него больше света? – Snawwz

ответ

0
  1. Если изменить адрес памяти, который pt указывает (как у вас есть во включенном функции), он не будет обновлять адрес памяти, на который указывает указатель в главной функции. Однако, если вы измените данные по этому адресу памяти, pt в основной функции также укажет на измененные данные.
  2. Да, поскольку они оба указывают на одни и те же базовые данные.
  3. Нет, C не имеет автоматической сборки мусора, и поэтому любая память, объявленная в куче, должна быть явно освобождена.
  4. Я несколько не уверен, что вы просите. Если вы освободите tempPt, pt будет обвисшим указателем в коде, который вы указали, поскольку оба они указывают на одни и те же базовые данные. Таким образом, если temptPt == pt, невозможно освободить данные, на которые указывает tempPt, не освобождая также данные, на которые указывает pt, поскольку они указывают на одно и то же.
+0

Цените это! Я обновил Вопрос 4, чтобы пролить немного больше света на то, что я пытаюсь сделать. – Snawwz

+0

Если 'tempPt' и' pt' не указывают на одни и те же данные, вы можете освободить данные, на которые указывает 'pt', а затем возвратить' tempPtr' из функции.Таким образом, ваш вызов функции будет 'pt = function (pt);' – user3147395

+0

Отлично, я просто думал об одном и том же! Я очень ценю это. ура – Snawwz

Смежные вопросы