Как создать экземпляр новой структуры в цикле - PullRequest
0 голосов
/ 21 ноября 2018

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

struct table_entry { 
          _Bool valid; //probably not needed can just use check for null
          _Bool mem; 
          int index; // will be number between 0-63
  };
  typedef struct{
          int proc_id;
          struct table_entry *pte[64];
  } page_table ;

Здесь я пытаюсь создать новый экземпляр page_table, но все равно получаю тот же адрес: я думаю, что проблема в первых нескольких строках первого, еслигде я пытаюсь создать новый экземпляр структуры.

for (int i = 0; i < size; i++) {
    if ((strcmp(words[i], "new") == 0)) {
        page_table pt;
        printf("address of pt:%d", (int) &pt);
        pt.proc_id = atoi(words[i + 1]);
        proceses[atoi(words[i + 1])] = &pt;
        printf("new process: %s:%d\n", words[i],
               proceses[atoi(words[i + 1])]->proc_id);
    } else if ((strcmp(words[i], "switch") == 0)) {
        printf("switching to process: %s\n", words[i + 1]);
        int process = atoi(words[i + 1]);
        page_table cur_pt = *proceses[process];
        // change the current page table reference
        printf("process ID%d: %d\n", process, cur_pt.proc_id);
    } else if ((strcmp(words[i], "access") == 0)) {
        //      printf("accessing memory: %d\n", atoi(words[i + 1]) >> 10);
    }
    for (int i = 0; i <= size; i++) {
        //      printf("%s\n", words[i]);
    }
}

Я искал, чтобы попытаться найти лучший способ справиться с этим, и я не совсем уверен, что я ищу,Я изучил анонимные структуры и попытался выделить память с помощью malloc.Похоже, я не нашел успеха ни в одном из этих подходов, хотя я не уверен, что делал их правильно.Спасибо за любую помощь и дайте мне знать, если вы хотите увидеть что-нибудь еще или у вас есть какие-либо вопросы.

1 Ответ

0 голосов
/ 21 ноября 2018

Проблема в том, что pt имеет только область видимости блока.В конце блока }, pt больше не существует.

if ((strcmp(words[i], "new") == 0)) {
    page_table pt;
    ...
}

// pt Doesn't Exist Anymore

Чтобы решить эту проблему, используйте malloc для динамического выделения памяти:

if ((strcmp(words[i], "new") == 0)) {
    page_table *pt = malloc(sizeof(*pt));
    ...
}

Следует отметить, что если вы переписываете pt без free его и теряете прежний адрес, вы будете страдать от утечки памяти .

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