堆内存C中的2D结构数组

时间:2018-07-20 17:37:00

标签: c struct malloc

当我尝试在动态内存中初始化结构的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);

1 个答案:

答案 0 :(得分:0)

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

因此对于一维数组,您可以执行以下操作:

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

但是对于2D数组:

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) {