我正在使用2d指针数组,每个指针指向一个链接的产品列表。 我想构建一个列出所有列表中所有产品的函数。 这是我的结构:
typedef struct object product, *pprod;
struct object{
int type;
int quantity;
pprod next;
};
这就是我定义数组的方式(它必须是动态的):
n=4;
m=3;
pprod (*t)[m] = malloc(n * sizeof *t);
list_all(t,n,m);
这是显示所有产品的功能:
void list_all(pprod** t , int size_n , int size_m) {
int i,j;
for(i=0;i<size_n;i++){
printf("--- Corridor ---: %d\n", i);
for(j=0;j<size_m;j++){
printf("--- Shelf ---: %d\n",j);
printf("product:%d quantity:%d",t[i][j]->type,t[i][j]->quantity);
}
}
}
我在将数组作为参数传递时遇到了麻烦。你能帮我找到问题吗? 谢谢您的帮助。
答案 0 :(得分:1)
好吧,首先创建数组是错误的。你只是将一个(单个)大小为4的向量分配给第m + 1个元素(t向量,除非你在别处做,指向随机区域)。
n=4;
m=3;
product **t, *newitem;
t= (product **)calloc(n, sizeof(product *)); // array of n pointers (corridor)
for (int i= 0; i<n; i++) {
t[i]= (product *)calloc(m, sizeof(product)) // array of m prod structs (m shelfs per corridor)
}
// access some array members (t[n][m] max t[0-2][0-3])
t[0][0].type= 0;
t[0][0].quantity= 0;
t[0][1].type= 1;
t[0][1].quantity= 11;
...
t[1][2].type= 12;
t[1][2].quantity= 1212;
....
t[2][3].type= 23;
t[2][3].quantity= 2323;
// more products could be linked to the existing ones
newitem= calloc(1, sizeof product);
newitem->type= 231;
newitem->quantity= 231231;
t[2][3].next= newitem;
// now list them via below function
list_all(t,n,m);
....
void list_all(product **t , int size_n , int size_m)
{
int i,j;
product *p;
for(i=0;i<size_n;i++){
printf("--- Corridor ---: %d\n", i);
for(j=0;j<size_m;j++){
printf("--- Shelf ---: %d\n",j);
p= &t[i][j];
do {
printf("product:%d quantity:%d", p->type, p->quantity);
p= p->next;
} (while p!=NULL);
}
}
}
有关详细信息,请参阅我在Etienne的回答中的评论。
答案 1 :(得分:1)
从您的问题描述中,您想要代表i走廊* j shelfs * k产品,其中每个产品都有数量和类型。
在你的问题中,你说你想要使用2D数组指针,但你的函数list_all
将3D数组作为第一个参数(t
的类型为object***
)。此外,您的结构object
应该是一个链接列表节点,因为它有next
成员,但您使用它就像一个数组,例如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;
}
答案 2 :(得分:0)
pprod已经是一个指针,我相信问题是你如何将参数传递给函数。
尝试更改为此函数原型: t已经是指向指针的指针,无论如何你都不能改变它。
void list_all(pprod* t , int size_n , int size_m) {