从您的问题描述中,您想要表示 i 个走廊 * j 个货架 * k 个产品,其中每个产品都有一个数量和一个类型。
在您的问题中,您说您想使用 2D 指针数组,但您的函数list_all
将 3D 数组作为第一个参数(t
属于 type object***
)。此外,您的结构object
应该是一个链表节点,因为它有一个next
成员,但是您像数组一样使用它,例如 with t[i][j]->quantity
,它不能工作并尝试访问未分配的内存。
为了帮助减少这种混淆,更明确地命名您的变量并避免使用一个字母的变量名称(在您的问题中为 n、m、t),循环迭代器除外。你的程序会更容易阅读,这些问题也会更容易出现。
这是使用 3D 数组解决您的问题的有效解决方案:
#include <stdio.h>
#include <stdlib.h>
typedef struct object prod;
struct object {
int type;
int quantity;
};
void list_all(prod ***shop, int nb_corridors , int nb_shelfs, int nb_prods)
{
int i,j,k;
for (i = 0; i < nb_corridors; i++) {
printf ("--- Corridor ---: %d\n", i);
for (j = 0; j < nb_shelfs; j++) {
printf ("--- Shelf ---: %d\n", j);
for (k = 0; k < nb_prods; k++) {
printf ("--- Product ---: %d\n", k);
printf ("type:%d quantity:%d\n",
shop[i][j][k].type, shop[i][j][k].quantity);
}
}
}
}
int main(void)
{
int nb_corridors = 4;
int nb_shelfs = 5;
int nb_prods = 3;
prod ***shop;
// array of n pointers (corridor)
shop = malloc(nb_corridors * sizeof(*shop));
printf("sizeof(*shop)=%ld\n", sizeof(*shop));
int i, j;
for (i = 0; i < nb_corridors; i++) {
// nb_shelfs shelfs per corridor)
shop[i] = malloc(nb_shelfs * sizeof(*shop[i]));
printf("sizeof(*shop[i])=%ld\n", sizeof(*shop[i]));
for(j = 0; j < nb_shelfs; j++) {
shop[i][j] = malloc(nb_prods * sizeof(*shop[i][j]));
printf("sizeof(*shop[i][j])=%ld\n", sizeof(*shop[i][j]));
}
}
//initialize with dummy values
int k;
for(i = 0; i < nb_corridors; i++) {
for(j = 0; j < nb_shelfs; j++) {
for(k = 0; k < nb_prods; k++) {
shop[i][j][k].type = k;
shop[i][j][k].quantity;
}
}
}
list_all(shop, nb_corridors, nb_shelfs, nb_prods);
return 0;
}