C массив указателей, меняющих адрес случайным образом - PullRequest
0 голосов
/ 31 октября 2019

Я пишу код для постфиксного калькулятора, для которого мне нужно добавить токены и значения ("a = 5", "b = 10") в массив указателей.

Этот массивуказатели используются, так как я реализую отдельную цепочку. Поэтому каждый индекс является началом связанного списка токенов и значений. Однако существует такая странная ошибка / ошибка, которая заключается в том, что адреса указателей в массиве (начинающиеся как все NULL) изменяются между ними, когда в этом указателе не осуществляется доступ к памяти или изменение адреса. Это происходит между разбором массива указателей. Изображение здесь 1 показывает, что именно произошло, когда я запустил GDB в программе. Красная стрелка указывает на выполняемую линию. Синяя область - это наблюдаемая память, а выделенная линия желтым цветом показывает, что адрес изменился. Вы можете видеть, что предыдущие адреса для той же таблицы symtab-> [3] все равны NULL ({0x0}). Есть идеи, почему это происходит? Сам код здесь ниже,

//This part of the program iterates through each linked list
//Previous declaration of Array of Pointers- 
//Symbol* localArrayOfPointers[HASH_TABLE_INITIAL]
Symbol** current = symtab->table;
  for (int i = 0; i < hash_get_capacity(symtab); i++)
  { //The address changes in between here I believe
    if(current[i] == NULL){
      continue;
    }
    else{
//Other code omitted as there is nothing changing any addresses

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Неинициализированный указатель не обязательно должен быть указателем NULL, он может указывать на любой адрес, поэтому выражение «if» всегда ложно, если оно не присвоено NULL.

0 голосов
/ 31 октября 2019

Возможно, проблема с текущим объявлением.

Массив указателей означает Symbol *current[n]. В вашем коде это указатель на указатель (двойной указатель). Но я понимаю, что вам нужен массив указателей.

Вы индексируете двойной указатель и проверяете на равенство с нулем. Итак, это должен быть массив указателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...