如何在循环中实例化新的结构实例

时间:2018-11-21 18:28:20

标签: c pointers struct

我试图每次用新的结构填充指向结构的指针数组。我遇到的问题是结构指针数组似乎充满了指向相同结构的指针。我习惯于使用其他语言,在这些语言中我可以说new,它会调用一个构造函数,该构造函数会产生一个新的实例,因此您仍然可以使用相同的名称但获得一个新地址。 这是我的结构代码:

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实例,但无论如何都获得相同的地址:如果我试图在其中创建新的struct实例,我认为问题出在第一行的前几行之内。 / p>

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 :(得分:0)

您遇到的问题是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并丢失了先前的地址,则会遭受memory leak的困扰。