c - 堆内存 C 中的二维结构数组

标签 c struct malloc

当我尝试初始化动态内存中的二维结构数组时,我不断遇到段错误。我知道一维结构数组在技术上是指向指针的指针,我认为二维结构数组也以这种方式运行,但似乎可能不是?

代码:

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

最佳答案

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

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

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

关于c - 堆内存 C 中的二维结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51447767/

相关文章:

c# - 复数排序

C Fuctions 中使用的 Heap 还不清楚

c - malloc 错误 : incorrect checksum

c - 如何在 C 中的 strcpy() 之前循环初始化 char 数组并一次又一次地清空它?

c - 如何使用c中的库函数验证包含十六进制浮点常量的字符串

c - C中矩阵的段错误

json - Golang jsonable 指向 slice 中不同结构的指针

c - 为什么数组元素的总和最终总是打印相同的值?

c - 使用成员结构定义结构

c - 为什么我的函数有时会进入无限循环?