【问题标题】:2D array of structs in heap memory C堆内存 C 中的二维结构数组
【发布时间】:2018-12-29 01:47:00
【问题描述】:

当我尝试在动态内存中初始化结构的二维数组时,我不断收到段错误。我知道 1D 结构数组在技术上是指向指针的指针,我认为 2D 结构数组也可以这样工作,但似乎可能不是?

代码:

typedef struct PTE {
    unsigned int faddr:7;           
    unsigned int present:1;
    unsigned int wp:1;
    unsigned int mod:1;
    unsigned int ref:1;
    unsigned int pout:1;
    unsigned int fmap:1;
} PTE; 

void init_pte(PTE **pgtbl_l, int num_ps) {
// Initialize all fields to zero
    for (int i=0; i<num_ps; i++) {
        for(int j=0; j<64; j++) {
            PTE *new_pte = malloc(sizeof(PTE));
            pgtbl_l[i][j] = *new_pte;
            new_pte->faddr = 0;
            new_pte->present = 0;
            new_pte->wp = 0;
            new_pte->mod = 0;
            new_pte->ref = 0;
            new_pte->pout = 0;
            new_pte->fmap = 0;
        }
    }
}

void print_pagetable(PTE **pgtbl_l, int num_ps) {
    for (int i=0; i<num_ps; i++) {
        printf("PT[%d]: ", i);
        for (int j=0; j<64; j++) {
            printf("faddr: %d pres: %d wp: %d mod: %d ref %d", pgtbl_l[i][j].faddr,
                   pgtbl_l[i][j].present, pgtbl_l[i][j].wp, pgtbl_l[i][j].mod,
                   pgtbl_l[i][j].ref);
        }
    }
    printf("\n");
}

PTE *pgtbl_l[num_ps][64];                   
init_pte(pgtbl_l, num_ps); 
print_pagetable(pgtbl_l, num_ps);

【问题讨论】:

  • 请详细说明“结构的一维数组在技术上是指向指针的指针”。这不符合我的理解。也许显示一个“一维结构数组”的声明以供参考/比较,并将其与一个二维结构数组的声明、一个一维 int 数组和一个二维 int 数组进行对比。
  • 我想如果你初始化一个结构数组并想要动态创建它,你必须将它初始化为 STRUCT *mystruct[10]; 并将其传递为 int myfunc(**mystruct);
  • @ThomasM 这是一个指向结构的指针的数组。

标签: c struct malloc


【解决方案1】:

指针和数组不是一回事。在许多情况下,数组衰减为指向其第一个元素的指针,但这不会向下流向多维数组。

所以对于一维数组,您可以这样做:

char A[5];
char *p = A;

但是对于二维数组:

char A[5][6];
char (*p)[6] = A;

在后一种情况下,A 是一个大小为 5 的数组,其中每个元素都是一个大小为 6 的数组。因此指针衰减的数组仅发生在第一个维度上。

您需要将函数定义更改为:

void init_pte(PTE pgtbl_l[][64], int num_ps) {

还有:

void print_pagetable(PTE pgtbl_l[][64], int num_ps) {

【讨论】:

  • 好的,谢谢,我会试试的。我还应该将其初始化为PTE *pgtbl_l[num_ps][64];吗?
  • @ThomasM 不,应该是PTE pgtbl_l[num_ps][64];
  • 并将其传递为:init_pte(pgtbl_l, num_ps);?
  • @ThomasM 是的,以同样的方式传递。
猜你喜欢
  • 2021-04-21
  • 2021-11-19
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多