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